Analysis

Preparations

Loading the neccessary packages

library("tidyverse")
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 2.2.1     ✔ purrr   0.2.4
✔ tibble  1.4.2     ✔ dplyr   0.7.4
✔ tidyr   0.7.2     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library("Seurat")
Loading required package: cowplot

Attaching package: ‘cowplot’

The following object is masked from ‘package:ggplot2’:

    ggsave

Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand
library("Matrix")
library("stringr")
library("knitr")
library("kableExtra")
library("pheatmap")
library("RColorBrewer")
library("clusterProfiler")
Loading required package: DOSE
DOSE v3.4.0  For help: https://guangchuangyu.github.io/DOSE

If you use DOSE in published research, please cite:
Guangchuang Yu, Li-Gen Wang, Guang-Rong Yan, Qing-Yu He. DOSE: an R/Bioconductor package for Disease Ontology Semantic and Enrichment analysis. Bioinformatics 2015, 31(4):608-609

clusterProfiler v3.4.4  For help: https://guangchuangyu.github.io/clusterProfiler

If you use clusterProfiler in published research, please cite:
Guangchuang Yu., Li-Gen Wang, Yanyan Han, Qing-Yu He. clusterProfiler: an R package for comparing biological themes among gene clusters. OMICS: A Journal of Integrative Biology. 2012, 16(5):284-287.

Attaching package: ‘clusterProfiler’

The following object is masked from ‘package:purrr’:

    simplify
library("ReactomePA")
ReactomePA v1.22.0  For help: https://guangchuangyu.github.io/ReactomePA

If you use ReactomePA in published research, please cite:
Guangchuang Yu, Qing-Yu He. ReactomePA: an R/Bioconductor package for reactome pathway analysis and visualization. Molecular BioSystems 2016, 12(2):477-479
save_csv <- TRUE

Setup vectors needed for the analysis: Genes which are markers for the cell types

markers.biol.validated <- c("Thbs4","Cxcl14","Cd9","Nr2e1","Id2","Ascl1","Egfr","Dcx","Dlx1","Mki67","Sox2","S100b","Cd24a","Ift88","Foxj1","Pdgfrb","Pecam1","Slc1a3","Gfap","Nes","Cxcl10","Rpl32","Hes1","Hes5")
markers.custom.order <- c("Sfrp5","Bmpr1a","Vcam1","Slc1a3","Id2","Hes1","Hes5","Egfr","Ascl1","Mki67","Rpl22","Cd9","Nr2e1","Sox2","S100b")

Load a list of cell cycle specific genes (taken from: http://satijalab.org/seurat/cell_cycle_vignette.html)

cc.genes <- readLines(con = "cell_cycle_genes/cell_cycle_vignette_files/regev_lab_cell_cycle_genes.txt")
cc.genes <- str_to_title(cc.genes)
# Separate markers of G2/M phase and markers of S phase
s.genes <- cc.genes[1:43]
g2m.genes <- cc.genes[44:97]

Loading the data

datadir <- "count_table/filtered_gene_bc_matrices_mex/mm10/"
data_10X2 <- Read10X(data.dir = file.path( datadir) )

Create a Seurat object with the 10X data

seurat_10X2 <- CreateSeuratObject(raw.data = data_10X2, min.cells = 3, min.genes = 1500, project = "young_vs_old_10X2")

Add Metadata and check QC values

mito.genes <- grep(pattern = "^mt-", x = rownames(x = seurat_10X2@data), value = TRUE)
percent.mito <- Matrix::colSums(seurat_10X2@raw.data[mito.genes, ])/Matrix::colSums(seurat_10X2@raw.data)
seurat_10X2 <- AddMetaData(object = seurat_10X2, metadata = percent.mito, col.name = "percent.mito")
VlnPlot(object = seurat_10X2, features.plot = c("nGene", "nUMI", "percent.mito"), nCol = 3 )

Annotate the cells with the age of the animals

We can also annotate the age of the mouse from which the cells were prepared (young or old). We know that all cell barcodes ending in ...-1 are beloning to cells from old old mice, the cell barcodes ending in ...-2 are from young mice.

age.cells <- data.frame( age = as.factor(rownames(seurat_10X2@meta.data)) ) 
rownames(age.cells) <- rownames(seurat_10X2@meta.data) 

age.cells$age <- stringr::str_replace(age.cells$age , pattern = "^\\w+-1$" , replacement = "old")
age.cells$age <- stringr::str_replace(age.cells$age , pattern = "^\\w+-2$" , replacement = "young")

age.cells$age_num <- age.cells$age
age.cells$age_num <- stringr::str_replace(age.cells$age_num , pattern = "old" , replacement = "1")
age.cells$age_num <- stringr::str_replace(age.cells$age_num , pattern = "young" , replacement = "2")
age.cells$age_num <- as.numeric(age.cells$age_num)

age.cells$age <- factor(age.cells$age)

seurat_10X2 <- AddMetaData(seurat_10X2, age.cells , "age")

Check scatterplots of nUMI, nGene and % of mitochondrial genes

par(mfrow = c(1, 2))
GenePlot(object = seurat_10X2, gene1 = "nUMI", gene2 = "percent.mito")
GenePlot(object = seurat_10X2, gene1 = "nUMI", gene2 = "nGene")

Filter the cells which have too high mitochondrial content

seurat_10X2 <- FilterCells(object = seurat_10X2, subset.names = c("nGene", "percent.mito"), 
    low.thresholds = c(1500, -Inf), high.thresholds = c(4500, 0.10))

Check scatterplots of nUMI, nGene and % of mitochondrial genes after filtering

par(mfrow = c(1, 2))
GenePlot(object = seurat_10X2, gene1 = "nUMI", gene2 = "percent.mito")
GenePlot(object = seurat_10X2, gene1 = "nUMI", gene2 = "nGene")

Log Normalize the data

seurat_10X2 <- NormalizeData(object = seurat_10X2, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|

Scale the data and regress out the influence of nUMI and percent.mito

seurat_10X2 <- ScaleData(object = seurat_10X2, vars.to.regress = c("nUMI", "percent.mito" , "nGene"))

Regress out difference between S phase and G2/M Phase

seurat_10X2 <- CellCycleScoring(object = seurat_10X2, s.genes = s.genes, g2m.genes = g2m.genes, set.ident = TRUE)

Meta data columns

We can see that the columns S.Score, G2M.Score and Phase are now added to the meta data table

head(seurat_10X2@meta.data)
seurat_10X2@meta.data$CC.Difference <- seurat_10X2@meta.data$S.Score - seurat_10X2@meta.data$G2M.Score
seurat_10X2 <- ScaleData(object = seurat_10X2, vars.to.regress = "CC.Difference", display.progress = FALSE)

Dimensional reduction and clustering

Find variable genes

seurat_10X2 <- FindVariableGenes(object = seurat_10X2, mean.function = ExpMean, dispersion.function = LogVMR, 
    x.low.cutoff = 0.0125, x.high.cutoff = 4, y.cutoff = 0.5)
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**************************************************|

Using these parameters we have identified 2236 genes as variable.

Run PCA

Now we use the detected variable genes to peform PCA on the data

seurat_10X2 <- RunPCA(object = seurat_10X2, pc.genes = seurat_10X2@var.genes, do.print = TRUE, pcs.print = 1:5, genes.print = 5  , seed.use = 2 )
seurat_10X2 <- ProjectPCA(object = seurat_10X2 )
seurat_10X2 <- JackStraw(object = seurat_10X2  )

Elbowplot PCA

PCElbowPlot(object = seurat_10X2)

PCA Plot

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 4)

Run t-SNE

Use graph-based clustering to cluster the cells in our dataset

seurat_10X2 <- FindClusters(seurat_10X2, reduction.type = "pca", dims.use = 1:8, save.SNN = T , force.recalc = TRUE)

Plot t-SNE plot

TSNEPlot(object = seurat_10X2)

FeaturePlot(object = seurat_10X2 , features.plot = "age_num" , cols.use = c("red","forestgreen") , no.legend = FALSE ) 

FeaturePlot(object = seurat_10X2 , features.plot = "nUMI" , cols.use = c("lightgrey","red") , no.legend = FALSE )

FeaturePlot(object = seurat_10X2 , features.plot = "nGene" , cols.use = c("lightgrey","red") , no.legend = FALSE )

Let's look at the

markers.seurat_10X2 <- FindAllMarkers(seurat_10X2, print.bar = FALSE , only.pos = TRUE , return.thresh = 0.05)
markers.seurat_10X2 %>% filter(cluster == 0)
markers.seurat_10X2 %>% filter(cluster == 1)
markers.seurat_10X2 %>% filter(cluster == 2)
markers.seurat_10X2 %>% filter(cluster == 3)
markers.seurat_10X2 %>% filter(cluster == 4)
markers.seurat_10X2 %>% filter(cluster == 5)
markers.seurat_10X2 %>% filter(cluster == 6)
markers.seurat_10X2 %>% filter(cluster == 7)
markers.seurat_10X2 %>% filter(cluster == 8)
markers.seurat_10X2 %>% filter(cluster == 9)
markers.seurat_10X2 %>% filter(cluster == 10)

Differential gene expression between cluster 6 and 8

markers_cluster_6_vs_8 <- FindMarkers(object = seurat_10X2 , ident.1 = 6 , ident.2 = 8 , only.pos = TRUE , print.bar = FALSE )
markers_cluster_6_vs_8

Cluster 6 shows increased expression of Mapk-Pathway related genes, immediate-early genes and transcription factors, like: Jun, Fos, Atf3, Ier2 ...

markers_cluster_8_vs_6 <- FindMarkers(object = seurat_10X2 , ident.1 = 8  , ident.2 = 6 , only.pos = TRUE , print.bar = FALSE )
markers_cluster_8_vs_6

tSNE feature plots: marker genes

TSNEPlot(object = seurat_10X2)

## quiescent Markers
FeaturePlot(object = seurat_10X2 , features.plot = "Thbs4" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Id2" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Cxcl14" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Stem Cell markers
FeaturePlot(object = seurat_10X2 , features.plot = "Slc1a3" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Nr2e1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Hes1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Hes5" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Nes" ,cols.use = c("lightblue","red") , no.legend = FALSE)

##
FeaturePlot(object = seurat_10X2 , features.plot = "Cxcl10" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Proliferation markers
FeaturePlot(object = seurat_10X2 , features.plot = "Rpl22" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Rpl32" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Cd9" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Astrocyte markers
FeaturePlot(object = seurat_10X2 , features.plot = "S100b" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Gfap" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Active NSC markers
FeaturePlot(object = seurat_10X2 , features.plot = "Mki67" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Ascl1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Egfr" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## TAPs
FeaturePlot(object = seurat_10X2 , features.plot = "Vcam1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Dlx1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Neuroblast marker
FeaturePlot(object = seurat_10X2 , features.plot = "Dcx" ,cols.use = c("lightblue","red") , no.legend = FALSE)

##
FeaturePlot(object = seurat_10X2 , features.plot = "Sfrp5" ,cols.use = c("lightblue","red") , no.legend = FALSE)

## Oligodenrocyte marker
FeaturePlot(object = seurat_10X2 , features.plot = "Olig1" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Pdgfra" ,cols.use = c("lightblue","red") , no.legend = FALSE)

FeaturePlot(object = seurat_10X2 , features.plot = "Sox10" ,cols.use = c("lightblue","red") , no.legend = FALSE)

Check tSNE Plot with markers found by Basak et al. (2018)

# Load the genes as vector
markers <- c( "Agt","Slc6a9","Etnppl","Slc6a1","Sparc",
                            "Slc1a3","Bcan","Tspan7","Htra1","Cldn10","Ptn","Acsl6","Fgfr3",
                            "Sparcl1","Atp1a2","Gpr37l1","Gja1","Prnp","Acsl3","Aqp4","Apoe","Gm26917",       # markers for quiescent NSCs - Gm26917 = Rn45s
                            "Cst3","Clu","Slc1a2","Prdx6","Mt1","Aldoc",                                    # shared between quiescent and primed NSCs - slc1a2 instead of scl1a2 (probably typo)
                            "Thbs4","Ntrk2","Fxyd1","Gstm1","Igfbp5","S100a6","Itm2b","Sfrp1","Dkk3","C4b",
                            "Acot1","Luc7l3","Ckb",
                            "Cpe","Dbi",                                                                    # primed NSCs and early active NSCs
                            "Miat","Lima1","Pabpc1","Ascl1","Rpl12","Mycn","Olig2",
                            "Pcna","Hsp90aa1","Hnrnpab","Ran","Ppia",
                            "Eef1a1","Ptma","Rpl41","Npm1", "Rpsa", "Fabp7", "Egfr",                        # active NSCs
                            "Mki67","Dlx2","Dlx1","Cdca3","Dlx1as",
                            "Nrep","Tubb2b","Dcx","Btg1","Nfib",
                            "Gad1","Ndrg4","Snap25","Syt1","Rbfox3",
                            "Tmsb10","Stmn2","Cd24a","Dlx6os1","Tubb5","Tubb3","Ccnd2","Hmgn2","H2afz","Sox11","Tuba1b","Tmsb4x","Stmn1","Tpt1","Rpl18a"
                            )  
interval <- c( seq( 1, length(markers) , by = round(length(markers)/4) ) , length(markers) )
interval
[1]  1 24 47 70 92

a) Ascl6 - Clu

TSNEPlot(object = seurat_10X2)

for(i in seq( interval[1] , interval[2] )){
  FeaturePlot(object = seurat_10X2 , features.plot = markers[i] ,cols.use = c("lightblue","red") , no.legend = FALSE)
}

b) Sfrp1 - Ascl1

TSNEPlot(object = seurat_10X2)

for(i in seq( interval[2]+1 , interval[3] )){
  FeaturePlot(object = seurat_10X2 , features.plot = markers[i] ,cols.use = c("lightblue","red") , no.legend = FALSE)
}

c) Npm1 - Dcx

TSNEPlot(object = seurat_10X2)

for(i in seq( interval[3]+1 , interval[4] )){
  FeaturePlot(object = seurat_10X2 , features.plot = markers[i] ,cols.use = c("lightblue","red") , no.legend = FALSE)
}

d) Tubb5 - Rpl18a

TSNEPlot(object = seurat_10X2)

for(i in seq( interval[4]+1 , interval[5] )){
  FeaturePlot(object = seurat_10X2 , features.plot = markers[i] ,cols.use = c("lightblue","red") , no.legend = FALSE)
}

Violin plots: marker genes

## quiescent Markers
VlnPlot(object = seurat_10X2 , features.plot = "Thbs4" )

VlnPlot(object = seurat_10X2 , features.plot = "Id2" )

## Stem Cell markers
VlnPlot(object = seurat_10X2 , features.plot = "Slc1a3" )

VlnPlot(object = seurat_10X2 , features.plot = "Nr2e1" )

VlnPlot(object = seurat_10X2 , features.plot = "Hes1" )

VlnPlot(object = seurat_10X2 , features.plot = "Hes5" )

VlnPlot(object = seurat_10X2 , features.plot = "Nes" )

##
VlnPlot(object = seurat_10X2 , features.plot = "Cxcl10" )

VlnPlot(object = seurat_10X2 , features.plot = "Cxcl14" )

## Proliferation markers
VlnPlot(object = seurat_10X2 , features.plot = "Rpl22" )

VlnPlot(object = seurat_10X2 , features.plot = "Rpl32" )

VlnPlot(object = seurat_10X2 , features.plot = "Cd9" )

## Astrocyte markers
VlnPlot(object = seurat_10X2 , features.plot = "S100b" )

VlnPlot(object = seurat_10X2 , features.plot = "Gfap" )

## Active NSC markers & TAPS
VlnPlot(object = seurat_10X2 , features.plot = "Mki67" )

VlnPlot(object = seurat_10X2 , features.plot = "Ascl1" )

VlnPlot(object = seurat_10X2 , features.plot = "Egfr" )

VlnPlot(object = seurat_10X2 , features.plot = "Vcam1" )

VlnPlot(object = seurat_10X2 , features.plot = "Dlx1" )

VlnPlot(object = seurat_10X2 , features.plot = "Dlx2" )

VlnPlot(object = seurat_10X2 , features.plot = "Atp1a2" )

## Neuroblast marker
VlnPlot(object = seurat_10X2 , features.plot = "Dcx" )

##
VlnPlot(object = seurat_10X2 , features.plot = "Sfrp5" )

## Oligodenrocyte marker
VlnPlot(object = seurat_10X2 , features.plot = "Olig1" )

VlnPlot(object = seurat_10X2 , features.plot = "Pdgfra" )

VlnPlot(object = seurat_10X2 , features.plot = "Sox10" )

Heatmap marker genes

Set identities from marker gene expression

seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(0) ) , ident.use = "qNSC1"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(4) ) , ident.use = "qNSC2"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(6,8) ) , ident.use = "aNSC0"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(3,5) ) , ident.use = "aNSC1"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(1) ) , ident.use = "aNSC2"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(2) ) , ident.use = "TAP"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(7) ) , ident.use = "NB"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(10) ) , ident.use = "OPC"  )
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = WhichCells(object = seurat_10X2 , ident = c(9) ) , ident.use = "OD"  )

Build Cluster Tree

seurat_10X2 <- BuildClusterTree(object = seurat_10X2 , pcs.use = 1:8)
[1] "Finished averaging RNA for cluster aNSC0"
[1] "Finished averaging RNA for cluster aNSC1"
[1] "Finished averaging RNA for cluster aNSC2"
[1] "Finished averaging RNA for cluster NB"
[1] "Finished averaging RNA for cluster OD"
[1] "Finished averaging RNA for cluster OPC"
[1] "Finished averaging RNA for cluster qNSC1"
[1] "Finished averaging RNA for cluster qNSC2"
[1] "Finished averaging RNA for cluster TAP"

PCA Plot with identities

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 1, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 2, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 4)

PCAPlot(object = seurat_10X2 , dim.1 = 3, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 4, dim.2 = 5)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 1)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 2)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 3)

PCAPlot(object = seurat_10X2 , dim.1 = 5, dim.2 = 4)

tSNE feature plots: marker genes

TSNEPlot(object = seurat_10X2)

TSNEPlot(object = seurat_10X2 , do.label = TRUE)

Violin plots: marker genes

celltypes_order <- c("qNSC1","qNSC2","aNSC0","aNSC1","aNSC2","TAP","NB","OPC","OD")
## quiescent Markers
VlnPlot(object = seurat_10X2 , features.plot = "Thbs4" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Id2" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Stem Cell markers
VlnPlot(object = seurat_10X2 , features.plot = "Slc1a3" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Nr2e1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Hes1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Hes5" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Nes" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

##
VlnPlot(object = seurat_10X2 , features.plot = "Cxcl10" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Proliferation markers
VlnPlot(object = seurat_10X2 , features.plot = "Rpl22" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Rpl32" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Cd9" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Astrocyte markers
VlnPlot(object = seurat_10X2 , features.plot = "S100b" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Gfap" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Active NSC markers
VlnPlot(object = seurat_10X2 , features.plot = "Ascl1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Egfr" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## TAPs
VlnPlot(object = seurat_10X2 , features.plot = "Vcam1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Dlx1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Neuroblast marker
VlnPlot(object = seurat_10X2 , features.plot = "Dcx" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

##
VlnPlot(object = seurat_10X2 , features.plot = "Sfrp5" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

## Oligodenrocyte marker
VlnPlot(object = seurat_10X2 , features.plot = "Olig1" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Pdgfra" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = "Sox10" ,  do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = c("nUMI")  , do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = c("nGene")  , do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

VlnPlot(object = seurat_10X2 , features.plot = c("percent.mito")  , do.return = TRUE) + scale_x_discrete( limits = celltypes_order )

Heatmap marker genes

markers_plots <- c( "Thbs4" , "Id2" , "Slc1a3" , "Nr2e1" , "Hes1" , "Hes5" , "Nes" , "Cxcl10" , "Rpl22" , "Rpl32" , "Cd9" , "S100b" , "Gfap" , "Mki67" , "Ascl1" , "Egfr" , "Vcam1" , "Dlx1" , "Dcx" , "Sfrp5" , "Olig1" , "Pdgfra" , "Sox10" )
DoHeatmap(object = seurat_10X2 , genes.use = markers_plots , slim.col.label = TRUE , col.low = "blue" , col.mid = "white" , col.high = "red" , group.label.rot = TRUE  )

DoHeatmap(object = seurat_10X2 , genes.use = markers.custom.order , slim.col.label = TRUE , col.low = "blue" , col.mid = "white" , col.high = "red" , group.label.rot = TRUE )

DoHeatmap(object = seurat_10X2 , genes.use = markers , slim.col.label = TRUE , col.low = "blue" , col.mid = "white" , col.high = "red" , group.label.rot = TRUE  )

Save identities to meta.data table

seurat_10X2 <- StashIdent(object = seurat_10X2 , save.name = "celltype") 

Find marker genes for the subpopulations and save them as csv files

markers.seurat_10X2 <- FindAllMarkers(seurat_10X2)

   |+                                                 | 1 % ~26s          
   |++                                                | 2 % ~27s          
   |++                                                | 3 % ~27s          
   |+++                                               | 4 % ~27s          
   |+++                                               | 5 % ~26s          
   |++++                                              | 7 % ~26s          
   |++++                                              | 8 % ~26s          
   |+++++                                             | 9 % ~25s          
   |+++++                                             | 10% ~25s          
   |++++++                                            | 11% ~24s          
   |+++++++                                           | 12% ~24s          
   |+++++++                                           | 13% ~23s          
   |++++++++                                          | 14% ~23s          
   |++++++++                                          | 15% ~23s          
   |+++++++++                                         | 16% ~22s          
   |+++++++++                                         | 18% ~22s          
   |++++++++++                                        | 19% ~22s          
   |++++++++++                                        | 20% ~21s          
   |+++++++++++                                       | 21% ~21s          
   |+++++++++++                                       | 22% ~21s          
   |++++++++++++                                      | 23% ~20s          
   |+++++++++++++                                     | 24% ~20s          
   |+++++++++++++                                     | 25% ~20s          
   |++++++++++++++                                    | 26% ~19s          
   |++++++++++++++                                    | 27% ~19s          
   |+++++++++++++++                                   | 29% ~19s          
   |+++++++++++++++                                   | 30% ~18s          
   |++++++++++++++++                                  | 31% ~18s          
   |++++++++++++++++                                  | 32% ~18s          
   |+++++++++++++++++                                 | 33% ~18s          
   |++++++++++++++++++                                | 34% ~17s          
   |++++++++++++++++++                                | 35% ~17s          
   |+++++++++++++++++++                               | 36% ~17s          
   |+++++++++++++++++++                               | 37% ~17s          
   |++++++++++++++++++++                              | 38% ~16s          
   |++++++++++++++++++++                              | 40% ~16s          
   |+++++++++++++++++++++                             | 41% ~16s          
   |+++++++++++++++++++++                             | 42% ~15s          
   |++++++++++++++++++++++                            | 43% ~15s          
   |++++++++++++++++++++++                            | 44% ~15s          
   |+++++++++++++++++++++++                           | 45% ~14s          
   |++++++++++++++++++++++++                          | 46% ~14s          
   |++++++++++++++++++++++++                          | 47% ~14s          
   |+++++++++++++++++++++++++                         | 48% ~14s          
   |+++++++++++++++++++++++++                         | 49% ~13s          
   |++++++++++++++++++++++++++                        | 51% ~13s          
   |++++++++++++++++++++++++++                        | 52% ~13s          
   |+++++++++++++++++++++++++++                       | 53% ~12s          
   |+++++++++++++++++++++++++++                       | 54% ~12s          
   |++++++++++++++++++++++++++++                      | 55% ~12s          
   |+++++++++++++++++++++++++++++                     | 56% ~11s          
   |+++++++++++++++++++++++++++++                     | 57% ~11s          
   |++++++++++++++++++++++++++++++                    | 58% ~11s          
   |++++++++++++++++++++++++++++++                    | 59% ~11s          
   |+++++++++++++++++++++++++++++++                   | 60% ~10s          
   |+++++++++++++++++++++++++++++++                   | 62% ~10s          
   |++++++++++++++++++++++++++++++++                  | 63% ~10s          
   |++++++++++++++++++++++++++++++++                  | 64% ~09s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~09s          
   |++++++++++++++++++++++++++++++++++                | 67% ~09s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~08s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~07s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~06s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~06s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 26s

   |+                                                 | 1 % ~40s          
   |++                                                | 2 % ~39s          
   |++                                                | 3 % ~38s          
   |+++                                               | 4 % ~38s          
   |+++                                               | 5 % ~38s          
   |++++                                              | 6 % ~37s          
   |++++                                              | 7 % ~36s          
   |+++++                                             | 8 % ~36s          
   |+++++                                             | 9 % ~36s          
   |++++++                                            | 10% ~35s          
   |++++++                                            | 11% ~35s          
   |+++++++                                           | 12% ~35s          
   |+++++++                                           | 13% ~34s          
   |++++++++                                          | 14% ~34s          
   |++++++++                                          | 15% ~33s          
   |+++++++++                                         | 16% ~33s          
   |+++++++++                                         | 17% ~33s          
   |++++++++++                                        | 18% ~32s          
   |++++++++++                                        | 19% ~32s          
   |+++++++++++                                       | 20% ~31s          
   |+++++++++++                                       | 21% ~31s          
   |++++++++++++                                      | 22% ~31s          
   |++++++++++++                                      | 23% ~30s          
   |+++++++++++++                                     | 24% ~30s          
   |+++++++++++++                                     | 25% ~30s          
   |++++++++++++++                                    | 26% ~29s          
   |++++++++++++++                                    | 27% ~29s          
   |+++++++++++++++                                   | 28% ~28s          
   |+++++++++++++++                                   | 29% ~28s          
   |++++++++++++++++                                  | 30% ~28s          
   |++++++++++++++++                                  | 31% ~27s          
   |+++++++++++++++++                                 | 32% ~27s          
   |+++++++++++++++++                                 | 33% ~26s          
   |++++++++++++++++++                                | 34% ~26s          
   |++++++++++++++++++                                | 35% ~26s          
   |+++++++++++++++++++                               | 36% ~25s          
   |+++++++++++++++++++                               | 37% ~25s          
   |++++++++++++++++++++                              | 38% ~24s          
   |++++++++++++++++++++                              | 39% ~24s          
   |+++++++++++++++++++++                             | 40% ~24s          
   |+++++++++++++++++++++                             | 41% ~23s          
   |++++++++++++++++++++++                            | 42% ~23s          
   |++++++++++++++++++++++                            | 43% ~22s          
   |+++++++++++++++++++++++                           | 44% ~22s          
   |+++++++++++++++++++++++                           | 45% ~22s          
   |++++++++++++++++++++++++                          | 46% ~21s          
   |++++++++++++++++++++++++                          | 47% ~21s          
   |+++++++++++++++++++++++++                         | 48% ~20s          
   |+++++++++++++++++++++++++                         | 49% ~20s          
   |++++++++++++++++++++++++++                        | 51% ~20s          
   |++++++++++++++++++++++++++                        | 52% ~19s          
   |+++++++++++++++++++++++++++                       | 53% ~19s          
   |+++++++++++++++++++++++++++                       | 54% ~18s          
   |++++++++++++++++++++++++++++                      | 55% ~18s          
   |++++++++++++++++++++++++++++                      | 56% ~18s          
   |+++++++++++++++++++++++++++++                     | 57% ~17s          
   |+++++++++++++++++++++++++++++                     | 58% ~17s          
   |++++++++++++++++++++++++++++++                    | 59% ~16s          
   |++++++++++++++++++++++++++++++                    | 60% ~16s          
   |+++++++++++++++++++++++++++++++                   | 61% ~16s          
   |+++++++++++++++++++++++++++++++                   | 62% ~15s          
   |++++++++++++++++++++++++++++++++                  | 63% ~15s          
   |++++++++++++++++++++++++++++++++                  | 64% ~14s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~14s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~14s          
   |++++++++++++++++++++++++++++++++++                | 67% ~13s          
   |++++++++++++++++++++++++++++++++++                | 68% ~13s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~12s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~12s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~11s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~11s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~10s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~10s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~09s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~09s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~08s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 39s

   |+                                                 | 1 % ~60s          
   |++                                                | 2 % ~59s          
   |++                                                | 3 % ~59s          
   |+++                                               | 4 % ~59s          
   |+++                                               | 5 % ~58s          
   |++++                                              | 6 % ~57s          
   |++++                                              | 7 % ~56s          
   |+++++                                             | 8 % ~55s          
   |+++++                                             | 9 % ~55s          
   |++++++                                            | 10% ~54s          
   |++++++                                            | 11% ~54s          
   |+++++++                                           | 12% ~53s          
   |+++++++                                           | 13% ~52s          
   |++++++++                                          | 14% ~52s          
   |++++++++                                          | 15% ~52s          
   |+++++++++                                         | 16% ~51s          
   |+++++++++                                         | 18% ~50s          
   |++++++++++                                        | 19% ~50s          
   |++++++++++                                        | 20% ~49s          
   |+++++++++++                                       | 21% ~48s          
   |+++++++++++                                       | 22% ~48s          
   |++++++++++++                                      | 23% ~47s          
   |++++++++++++                                      | 24% ~46s          
   |+++++++++++++                                     | 25% ~46s          
   |+++++++++++++                                     | 26% ~45s          
   |++++++++++++++                                    | 27% ~44s          
   |++++++++++++++                                    | 28% ~44s          
   |+++++++++++++++                                   | 29% ~43s          
   |+++++++++++++++                                   | 30% ~43s          
   |++++++++++++++++                                  | 31% ~42s          
   |++++++++++++++++                                  | 32% ~41s          
   |+++++++++++++++++                                 | 33% ~41s          
   |++++++++++++++++++                                | 34% ~40s          
   |++++++++++++++++++                                | 35% ~39s          
   |+++++++++++++++++++                               | 36% ~39s          
   |+++++++++++++++++++                               | 37% ~38s          
   |++++++++++++++++++++                              | 38% ~37s          
   |++++++++++++++++++++                              | 39% ~37s          
   |+++++++++++++++++++++                             | 40% ~36s          
   |+++++++++++++++++++++                             | 41% ~36s          
   |++++++++++++++++++++++                            | 42% ~35s          
   |++++++++++++++++++++++                            | 43% ~35s          
   |+++++++++++++++++++++++                           | 44% ~34s          
   |+++++++++++++++++++++++                           | 45% ~33s          
   |++++++++++++++++++++++++                          | 46% ~33s          
   |++++++++++++++++++++++++                          | 47% ~32s          
   |+++++++++++++++++++++++++                         | 48% ~32s          
   |+++++++++++++++++++++++++                         | 49% ~31s          
   |++++++++++++++++++++++++++                        | 51% ~30s          
   |++++++++++++++++++++++++++                        | 52% ~30s          
   |+++++++++++++++++++++++++++                       | 53% ~29s          
   |+++++++++++++++++++++++++++                       | 54% ~28s          
   |++++++++++++++++++++++++++++                      | 55% ~28s          
   |++++++++++++++++++++++++++++                      | 56% ~27s          
   |+++++++++++++++++++++++++++++                     | 57% ~27s          
   |+++++++++++++++++++++++++++++                     | 58% ~26s          
   |++++++++++++++++++++++++++++++                    | 59% ~25s          
   |++++++++++++++++++++++++++++++                    | 60% ~25s          
   |+++++++++++++++++++++++++++++++                   | 61% ~24s          
   |+++++++++++++++++++++++++++++++                   | 62% ~23s          
   |++++++++++++++++++++++++++++++++                  | 63% ~23s          
   |++++++++++++++++++++++++++++++++                  | 64% ~22s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~21s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~21s          
   |++++++++++++++++++++++++++++++++++                | 67% ~20s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~20s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~19s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~18s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~18s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~17s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~16s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~16s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~15s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~14s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~14s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~13s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 01s

   |+                                                 | 1 % ~01m 22s      
   |++                                                | 2 % ~01m 22s      
   |++                                                | 3 % ~01m 20s      
   |+++                                               | 4 % ~01m 19s      
   |+++                                               | 5 % ~01m 18s      
   |++++                                              | 6 % ~01m 18s      
   |++++                                              | 7 % ~01m 17s      
   |+++++                                             | 8 % ~01m 16s      
   |+++++                                             | 9 % ~01m 15s      
   |++++++                                            | 10% ~01m 14s      
   |++++++                                            | 11% ~01m 14s      
   |+++++++                                           | 12% ~01m 13s      
   |+++++++                                           | 13% ~01m 13s      
   |++++++++                                          | 14% ~01m 12s      
   |++++++++                                          | 15% ~01m 12s      
   |+++++++++                                         | 16% ~01m 11s      
   |+++++++++                                         | 17% ~01m 10s      
   |++++++++++                                        | 18% ~01m 09s      
   |++++++++++                                        | 19% ~01m 08s      
   |+++++++++++                                       | 20% ~01m 08s      
   |+++++++++++                                       | 21% ~01m 07s      
   |++++++++++++                                      | 22% ~01m 06s      
   |++++++++++++                                      | 23% ~01m 05s      
   |+++++++++++++                                     | 24% ~01m 04s      
   |+++++++++++++                                     | 26% ~01m 03s      
   |++++++++++++++                                    | 27% ~01m 02s      
   |++++++++++++++                                    | 28% ~01m 02s      
   |+++++++++++++++                                   | 29% ~01m 01s      
   |+++++++++++++++                                   | 30% ~60s          
   |++++++++++++++++                                  | 31% ~59s          
   |++++++++++++++++                                  | 32% ~58s          
   |+++++++++++++++++                                 | 33% ~57s          
   |+++++++++++++++++                                 | 34% ~56s          
   |++++++++++++++++++                                | 35% ~55s          
   |++++++++++++++++++                                | 36% ~55s          
   |+++++++++++++++++++                               | 37% ~54s          
   |+++++++++++++++++++                               | 38% ~53s          
   |++++++++++++++++++++                              | 39% ~52s          
   |++++++++++++++++++++                              | 40% ~51s          
   |+++++++++++++++++++++                             | 41% ~50s          
   |+++++++++++++++++++++                             | 42% ~50s          
   |++++++++++++++++++++++                            | 43% ~49s          
   |++++++++++++++++++++++                            | 44% ~48s          
   |+++++++++++++++++++++++                           | 45% ~47s          
   |+++++++++++++++++++++++                           | 46% ~46s          
   |++++++++++++++++++++++++                          | 47% ~45s          
   |++++++++++++++++++++++++                          | 48% ~44s          
   |+++++++++++++++++++++++++                         | 49% ~43s          
   |+++++++++++++++++++++++++                         | 50% ~43s          
   |++++++++++++++++++++++++++                        | 51% ~42s          
   |+++++++++++++++++++++++++++                       | 52% ~41s          
   |+++++++++++++++++++++++++++                       | 53% ~40s          
   |++++++++++++++++++++++++++++                      | 54% ~39s          
   |++++++++++++++++++++++++++++                      | 55% ~38s          
   |+++++++++++++++++++++++++++++                     | 56% ~37s          
   |+++++++++++++++++++++++++++++                     | 57% ~37s          
   |++++++++++++++++++++++++++++++                    | 58% ~36s          
   |++++++++++++++++++++++++++++++                    | 59% ~35s          
   |+++++++++++++++++++++++++++++++                   | 60% ~34s          
   |+++++++++++++++++++++++++++++++                   | 61% ~33s          
   |++++++++++++++++++++++++++++++++                  | 62% ~32s          
   |++++++++++++++++++++++++++++++++                  | 63% ~31s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~31s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~30s          
   |++++++++++++++++++++++++++++++++++                | 66% ~29s          
   |++++++++++++++++++++++++++++++++++                | 67% ~28s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~27s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~26s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~25s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~25s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~24s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~23s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~22s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~21s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~20s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~19s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~18s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 26s

   |+                                                 | 1 % ~02m 30s      
   |++                                                | 2 % ~02m 29s      
   |++                                                | 3 % ~02m 27s      
   |+++                                               | 4 % ~02m 27s      
   |+++                                               | 5 % ~02m 25s      
   |++++                                              | 6 % ~02m 23s      
   |++++                                              | 7 % ~02m 21s      
   |+++++                                             | 8 % ~02m 20s      
   |+++++                                             | 9 % ~02m 18s      
   |++++++                                            | 10% ~02m 17s      
   |++++++                                            | 11% ~02m 15s      
   |+++++++                                           | 12% ~02m 14s      
   |+++++++                                           | 13% ~02m 12s      
   |++++++++                                          | 14% ~02m 12s      
   |++++++++                                          | 15% ~02m 10s      
   |+++++++++                                         | 16% ~02m 08s      
   |+++++++++                                         | 17% ~02m 07s      
   |++++++++++                                        | 18% ~02m 05s      
   |++++++++++                                        | 19% ~02m 04s      
   |+++++++++++                                       | 20% ~02m 02s      
   |+++++++++++                                       | 21% ~02m 01s      
   |++++++++++++                                      | 22% ~01m 59s      
   |++++++++++++                                      | 23% ~01m 58s      
   |+++++++++++++                                     | 24% ~01m 56s      
   |+++++++++++++                                     | 25% ~01m 55s      
   |++++++++++++++                                    | 26% ~01m 53s      
   |++++++++++++++                                    | 27% ~01m 52s      
   |+++++++++++++++                                   | 28% ~01m 50s      
   |+++++++++++++++                                   | 29% ~01m 49s      
   |++++++++++++++++                                  | 30% ~01m 47s      
   |++++++++++++++++                                  | 31% ~01m 45s      
   |+++++++++++++++++                                 | 32% ~01m 44s      
   |+++++++++++++++++                                 | 33% ~01m 43s      
   |++++++++++++++++++                                | 34% ~01m 41s      
   |++++++++++++++++++                                | 35% ~01m 39s      
   |+++++++++++++++++++                               | 36% ~01m 38s      
   |+++++++++++++++++++                               | 37% ~01m 36s      
   |++++++++++++++++++++                              | 38% ~01m 35s      
   |++++++++++++++++++++                              | 39% ~01m 35s      
   |+++++++++++++++++++++                             | 40% ~01m 33s      
   |+++++++++++++++++++++                             | 41% ~01m 32s      
   |++++++++++++++++++++++                            | 42% ~01m 30s      
   |++++++++++++++++++++++                            | 43% ~01m 28s      
   |+++++++++++++++++++++++                           | 44% ~01m 27s      
   |+++++++++++++++++++++++                           | 45% ~01m 25s      
   |++++++++++++++++++++++++                          | 46% ~01m 24s      
   |++++++++++++++++++++++++                          | 47% ~01m 22s      
   |+++++++++++++++++++++++++                         | 48% ~01m 21s      
   |+++++++++++++++++++++++++                         | 49% ~01m 19s      
   |++++++++++++++++++++++++++                        | 51% ~01m 17s      
   |++++++++++++++++++++++++++                        | 52% ~01m 16s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 14s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 13s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 11s      
   |++++++++++++++++++++++++++++                      | 56% ~01m 10s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 08s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 06s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 05s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 03s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 02s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 01s      
   |++++++++++++++++++++++++++++++++                  | 63% ~59s          
   |++++++++++++++++++++++++++++++++                  | 64% ~58s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~56s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~54s          
   |++++++++++++++++++++++++++++++++++                | 67% ~53s          
   |++++++++++++++++++++++++++++++++++                | 68% ~51s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~49s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~48s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~46s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~45s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~43s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~41s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~40s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~38s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~37s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~35s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~33s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~32s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~29s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~27s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 36s

   |+                                                 | 1 % ~01m 51s      
   |++                                                | 2 % ~01m 51s      
   |++                                                | 3 % ~01m 50s      
   |+++                                               | 4 % ~01m 52s      
   |+++                                               | 5 % ~01m 50s      
   |++++                                              | 6 % ~01m 49s      
   |++++                                              | 7 % ~01m 47s      
   |+++++                                             | 8 % ~01m 46s      
   |+++++                                             | 9 % ~01m 45s      
   |++++++                                            | 10% ~01m 43s      
   |++++++                                            | 11% ~01m 42s      
   |+++++++                                           | 12% ~01m 41s      
   |+++++++                                           | 13% ~01m 41s      
   |++++++++                                          | 14% ~01m 40s      
   |++++++++                                          | 15% ~01m 38s      
   |+++++++++                                         | 16% ~01m 37s      
   |+++++++++                                         | 18% ~01m 36s      
   |++++++++++                                        | 19% ~01m 34s      
   |++++++++++                                        | 20% ~01m 33s      
   |+++++++++++                                       | 21% ~01m 32s      
   |+++++++++++                                       | 22% ~01m 31s      
   |++++++++++++                                      | 23% ~01m 32s      
   |++++++++++++                                      | 24% ~01m 30s      
   |+++++++++++++                                     | 25% ~01m 29s      
   |+++++++++++++                                     | 26% ~01m 28s      
   |++++++++++++++                                    | 27% ~01m 26s      
   |++++++++++++++                                    | 28% ~01m 25s      
   |+++++++++++++++                                   | 29% ~01m 24s      
   |+++++++++++++++                                   | 30% ~01m 22s      
   |++++++++++++++++                                  | 31% ~01m 21s      
   |++++++++++++++++                                  | 32% ~01m 20s      
   |+++++++++++++++++                                 | 33% ~01m 19s      
   |++++++++++++++++++                                | 34% ~01m 18s      
   |++++++++++++++++++                                | 35% ~01m 16s      
   |+++++++++++++++++++                               | 36% ~01m 15s      
   |+++++++++++++++++++                               | 37% ~01m 14s      
   |++++++++++++++++++++                              | 38% ~01m 13s      
   |++++++++++++++++++++                              | 39% ~01m 11s      
   |+++++++++++++++++++++                             | 40% ~01m 10s      
   |+++++++++++++++++++++                             | 41% ~01m 09s      
   |++++++++++++++++++++++                            | 42% ~01m 08s      
   |++++++++++++++++++++++                            | 43% ~01m 07s      
   |+++++++++++++++++++++++                           | 44% ~01m 06s      
   |+++++++++++++++++++++++                           | 45% ~01m 04s      
   |++++++++++++++++++++++++                          | 46% ~01m 03s      
   |++++++++++++++++++++++++                          | 47% ~01m 02s      
   |+++++++++++++++++++++++++                         | 48% ~01m 01s      
   |+++++++++++++++++++++++++                         | 49% ~59s          
   |++++++++++++++++++++++++++                        | 51% ~59s          
   |++++++++++++++++++++++++++                        | 52% ~58s          
   |+++++++++++++++++++++++++++                       | 53% ~57s          
   |+++++++++++++++++++++++++++                       | 54% ~55s          
   |++++++++++++++++++++++++++++                      | 55% ~54s          
   |++++++++++++++++++++++++++++                      | 56% ~53s          
   |+++++++++++++++++++++++++++++                     | 57% ~52s          
   |+++++++++++++++++++++++++++++                     | 58% ~50s          
   |++++++++++++++++++++++++++++++                    | 59% ~49s          
   |++++++++++++++++++++++++++++++                    | 60% ~48s          
   |+++++++++++++++++++++++++++++++                   | 61% ~47s          
   |+++++++++++++++++++++++++++++++                   | 62% ~45s          
   |++++++++++++++++++++++++++++++++                  | 63% ~44s          
   |++++++++++++++++++++++++++++++++                  | 64% ~43s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~42s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~40s          
   |++++++++++++++++++++++++++++++++++                | 67% ~39s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~38s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~37s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~35s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~34s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~33s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~32s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~31s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~29s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~28s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~27s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~26s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~24s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~23s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 58s

   |+                                                 | 1 % ~02m 15s      
   |+                                                 | 2 % ~02m 14s      
   |++                                                | 3 % ~02m 13s      
   |++                                                | 4 % ~02m 14s      
   |+++                                               | 5 % ~02m 12s      
   |+++                                               | 6 % ~02m 10s      
   |++++                                              | 7 % ~02m 08s      
   |++++                                              | 8 % ~02m 07s      
   |+++++                                             | 9 % ~02m 05s      
   |+++++                                             | 10% ~02m 04s      
   |++++++                                            | 11% ~02m 02s      
   |++++++                                            | 12% ~02m 01s      
   |+++++++                                           | 13% ~02m 01s      
   |+++++++                                           | 14% ~02m 01s      
   |++++++++                                          | 15% ~01m 59s      
   |++++++++                                          | 16% ~01m 58s      
   |+++++++++                                         | 17% ~01m 56s      
   |+++++++++                                         | 18% ~01m 55s      
   |++++++++++                                        | 19% ~01m 53s      
   |++++++++++                                        | 20% ~01m 52s      
   |+++++++++++                                       | 21% ~01m 55s      
   |+++++++++++                                       | 22% ~01m 53s      
   |++++++++++++                                      | 23% ~01m 51s      
   |++++++++++++                                      | 24% ~01m 50s      
   |+++++++++++++                                     | 25% ~01m 48s      
   |+++++++++++++                                     | 26% ~01m 46s      
   |++++++++++++++                                    | 27% ~01m 45s      
   |++++++++++++++                                    | 28% ~01m 43s      
   |+++++++++++++++                                   | 29% ~01m 42s      
   |+++++++++++++++                                   | 30% ~01m 40s      
   |++++++++++++++++                                  | 31% ~01m 38s      
   |++++++++++++++++                                  | 32% ~01m 37s      
   |+++++++++++++++++                                 | 33% ~01m 35s      
   |+++++++++++++++++                                | 34% ~01m 34s      
   |++++++++++++++++++                                | 35% ~01m 33s      
   |++++++++++++++++++                                | 36% ~01m 31s      
   |+++++++++++++++++++                               | 37% ~01m 30s      
   |+++++++++++++++++++                               | 38% ~01m 28s      
   |++++++++++++++++++++                              | 39% ~01m 27s      
   |++++++++++++++++++++                              | 40% ~01m 25s      
   |+++++++++++++++++++++                             | 41% ~01m 24s      
   |+++++++++++++++++++++                             | 42% ~01m 22s      
   |++++++++++++++++++++++                            | 43% ~01m 21s      
   |++++++++++++++++++++++                            | 44% ~01m 19s      
   |+++++++++++++++++++++++                           | 45% ~01m 18s      
   |+++++++++++++++++++++++                           | 46% ~01m 16s      
   |++++++++++++++++++++++++                          | 47% ~01m 15s      
   |++++++++++++++++++++++++                          | 48% ~01m 14s      
   |+++++++++++++++++++++++++                         | 49% ~01m 12s      
   |+++++++++++++++++++++++++                         | 50% ~01m 11s      
   |++++++++++++++++++++++++++                        | 51% ~01m 09s      
   |++++++++++++++++++++++++++                        | 52% ~01m 08s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 06s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 05s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 03s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 02s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 01s      
   |+++++++++++++++++++++++++++++                     | 58% ~59s          
   |++++++++++++++++++++++++++++++                    | 59% ~58s          
   |++++++++++++++++++++++++++++++                    | 60% ~56s          
   |+++++++++++++++++++++++++++++++                   | 61% ~55s          
   |+++++++++++++++++++++++++++++++                   | 62% ~53s          
   |++++++++++++++++++++++++++++++++                  | 63% ~52s          
   |++++++++++++++++++++++++++++++++                  | 64% ~51s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~49s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~48s          
   |++++++++++++++++++++++++++++++++++                | 67% ~46s          
   |++++++++++++++++++++++++++++++++++               | 68% ~45s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~44s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~42s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~41s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~39s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~38s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~36s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~35s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~34s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~32s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~31s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~30s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~25s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 22s

   |+                                                 | 1 % ~01m 17s      
   |++                                                | 2 % ~01m 16s      
   |++                                                | 3 % ~01m 16s      
   |+++                                               | 4 % ~01m 15s      
   |+++                                               | 5 % ~01m 14s      
   |++++                                              | 6 % ~01m 13s      
   |++++                                              | 7 % ~01m 12s      
   |+++++                                             | 8 % ~01m 12s      
   |+++++                                             | 9 % ~01m 11s      
   |++++++                                            | 10% ~01m 10s      
   |++++++                                            | 11% ~01m 09s      
   |+++++++                                           | 12% ~01m 09s      
   |+++++++                                           | 13% ~01m 09s      
   |++++++++                                          | 14% ~01m 08s      
   |++++++++                                          | 15% ~01m 07s      
   |+++++++++                                         | 16% ~01m 06s      
   |+++++++++                                         | 18% ~01m 05s      
   |++++++++++                                        | 19% ~01m 04s      
   |++++++++++                                        | 20% ~01m 04s      
   |+++++++++++                                       | 21% ~01m 03s      
   |+++++++++++                                       | 22% ~01m 02s      
   |++++++++++++                                      | 23% ~01m 01s      
   |++++++++++++                                      | 24% ~01m 00s      
   |+++++++++++++                                     | 25% ~60s          
   |+++++++++++++                                     | 26% ~59s          
   |++++++++++++++                                    | 27% ~58s          
   |++++++++++++++                                    | 28% ~57s          
   |+++++++++++++++                                   | 29% ~56s          
   |+++++++++++++++                                   | 30% ~55s          
   |++++++++++++++++                                  | 31% ~55s          
   |++++++++++++++++                                  | 32% ~54s          
   |+++++++++++++++++                                 | 33% ~53s          
   |++++++++++++++++++                                | 34% ~52s          
   |++++++++++++++++++                                | 35% ~52s          
   |+++++++++++++++++++                               | 36% ~51s          
   |+++++++++++++++++++                               | 37% ~50s          
   |++++++++++++++++++++                              | 38% ~49s          
   |++++++++++++++++++++                              | 39% ~48s          
   |+++++++++++++++++++++                             | 40% ~47s          
   |+++++++++++++++++++++                             | 41% ~47s          
   |++++++++++++++++++++++                            | 42% ~46s          
   |++++++++++++++++++++++                            | 43% ~45s          
   |+++++++++++++++++++++++                           | 44% ~44s          
   |+++++++++++++++++++++++                           | 45% ~43s          
   |++++++++++++++++++++++++                          | 46% ~42s          
   |++++++++++++++++++++++++                          | 47% ~42s          
   |+++++++++++++++++++++++++                         | 48% ~41s          
   |+++++++++++++++++++++++++                         | 49% ~40s          
   |++++++++++++++++++++++++++                        | 51% ~39s          
   |++++++++++++++++++++++++++                        | 52% ~38s          
   |+++++++++++++++++++++++++++                       | 53% ~38s          
   |+++++++++++++++++++++++++++                       | 54% ~37s          
   |++++++++++++++++++++++++++++                      | 55% ~36s          
   |++++++++++++++++++++++++++++                      | 56% ~35s          
   |+++++++++++++++++++++++++++++                     | 57% ~34s          
   |+++++++++++++++++++++++++++++                     | 58% ~33s          
   |++++++++++++++++++++++++++++++                    | 59% ~33s          
   |++++++++++++++++++++++++++++++                    | 60% ~32s          
   |+++++++++++++++++++++++++++++++                   | 61% ~31s          
   |+++++++++++++++++++++++++++++++                   | 62% ~30s          
   |++++++++++++++++++++++++++++++++                  | 63% ~29s          
   |++++++++++++++++++++++++++++++++                  | 64% ~29s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~28s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~27s          
   |++++++++++++++++++++++++++++++++++                | 67% ~26s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~25s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~25s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~24s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~23s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~22s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~21s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~20s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~20s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~19s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~18s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~17s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 20s

   |+                                                 | 1 % ~50s          
   |++                                                | 2 % ~49s          
   |++                                                | 3 % ~49s          
   |+++                                               | 4 % ~49s          
   |+++                                               | 5 % ~48s          
   |++++                                              | 7 % ~48s          
   |++++                                              | 8 % ~47s          
   |+++++                                             | 9 % ~46s          
   |+++++                                             | 10% ~47s          
   |++++++                                            | 11% ~46s          
   |++++++                                            | 12% ~45s          
   |+++++++                                           | 13% ~45s          
   |++++++++                                          | 14% ~44s          
   |++++++++                                          | 15% ~44s          
   |+++++++++                                         | 16% ~43s          
   |+++++++++                                         | 17% ~42s          
   |++++++++++                                        | 18% ~42s          
   |++++++++++                                        | 20% ~41s          
   |+++++++++++                                       | 21% ~41s          
   |+++++++++++                                       | 22% ~40s          
   |++++++++++++                                      | 23% ~39s          
   |++++++++++++                                      | 24% ~39s          
   |+++++++++++++                                     | 25% ~38s          
   |++++++++++++++                                    | 26% ~38s          
   |++++++++++++++                                    | 27% ~37s          
   |+++++++++++++++                                   | 28% ~37s          
   |+++++++++++++++                                   | 29% ~36s          
   |++++++++++++++++                                  | 30% ~36s          
   |++++++++++++++++                                  | 32% ~35s          
   |+++++++++++++++++                                 | 33% ~34s          
   |+++++++++++++++++                                 | 34% ~34s          
   |++++++++++++++++++                                | 35% ~33s          
   |++++++++++++++++++                                | 36% ~33s          
   |+++++++++++++++++++                               | 37% ~32s          
   |++++++++++++++++++++                              | 38% ~32s          
   |++++++++++++++++++++                              | 39% ~31s          
   |+++++++++++++++++++++                             | 40% ~31s          
   |+++++++++++++++++++++                             | 41% ~30s          
   |++++++++++++++++++++++                            | 42% ~30s          
   |++++++++++++++++++++++                            | 43% ~29s          
   |+++++++++++++++++++++++                           | 45% ~29s          
   |+++++++++++++++++++++++                           | 46% ~28s          
   |++++++++++++++++++++++++                          | 47% ~27s          
   |++++++++++++++++++++++++                          | 48% ~27s          
   |+++++++++++++++++++++++++                         | 49% ~26s          
   |+++++++++++++++++++++++++                         | 50% ~26s          
   |++++++++++++++++++++++++++                        | 51% ~25s          
   |+++++++++++++++++++++++++++                       | 52% ~25s          
   |+++++++++++++++++++++++++++                       | 53% ~24s          
   |++++++++++++++++++++++++++++                      | 54% ~24s          
   |++++++++++++++++++++++++++++                      | 55% ~23s          
   |+++++++++++++++++++++++++++++                     | 57% ~22s          
   |+++++++++++++++++++++++++++++                     | 58% ~22s          
   |++++++++++++++++++++++++++++++                    | 59% ~21s          
   |++++++++++++++++++++++++++++++                    | 60% ~21s          
   |+++++++++++++++++++++++++++++++                   | 61% ~20s          
   |+++++++++++++++++++++++++++++++                   | 62% ~20s          
   |++++++++++++++++++++++++++++++++                  | 63% ~19s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~18s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~18s          
   |++++++++++++++++++++++++++++++++++                | 66% ~17s          
   |++++++++++++++++++++++++++++++++++                | 67% ~17s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~16s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~16s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~15s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~15s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~14s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~13s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~13s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~12s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~12s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~11s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 52s

t-SNE plots with cluster identity or with age

Color the tSNE plot by the age of the animals

x <- FeaturePlot(object = seurat_10X2 , features.plot = "age_num" , cols.use = c("slateblue","yellowgreen") , no.legend = FALSE , do.return = TRUE )

tsne_ageplot <- ggplot(data = x$age_num$data , mapping = aes(x = x , y = y , color = col)) + geom_point(size = 1) + scale_color_manual(values = c("slateblue","yellowgreen") , labels = c( "old" , "young" ) , name = "age of animal" ) + labs( x = "tSNE_1" , y = "tSNE_2" ) + coord_equal()
plotsize = 5
tsne_ageplot

#ggsave(plot = tsne_ageplot , filename = "age_tsne_hires.png" , width = plotsize , height = plotsize )
ggplot(data = x$age_num$data , mapping = aes(x = x , y = y , color = col)) + geom_point(size = 1) + scale_color_manual(values = c("slateblue","yellowgreen") , labels = c( "old" , "young" ) , name = "age of animal" ) + labs( x = "tSNE_1" , y = "tSNE_2" ) + coord_equal() # + guides(color = "none")

Color the tSNE by the identified celltypes and subpopulations

g <- TSNEPlot(seurat_10X2 , do.return = TRUE)
ggplot(data = g$data , mapping = aes(x = x , y = y , color = ident)) + 
  geom_point(size = 1) + 
  labs( x = "tSNE_1" , y = "tSNE_2" ) + 
  coord_equal() + 
  scale_color_manual(values =   c( qNSC1 = "steelblue" , qNSC2 = "steelblue1" , aNSC0 = "tomato" , aNSC1 = "sienna1", aNSC2 = "sienna3" , TAP = "green" , NB = "yellow" , OPC = "pink" , OD = "violet") , name = "Type" )

ggplot(data = g$data , mapping = aes(x = x , y = y , color = ident)) + 
  geom_point(size = 1) + 
  labs( x = "tSNE_1" , y = "tSNE_2" ) + 
  coord_equal() + 
  # guides(color = "none") + 
  scale_color_manual(values =   c( qNSC1 = "steelblue" , qNSC2 = "steelblue1" , aNSC0 = "tomato" , aNSC1 = "sienna1", aNSC2 = "sienna3" , TAP = "green" , NB = "yellow" , OPC = "pink" , OD = "violet") , name = "Type" )

Save the analysis results so far as RDS file

# saveRDS(object = seurat_10X2 , file = "seurat_10X2_clustered_min_1500_nGene_all_cells.RDS")

Identify and filter out contaminating ependymal cells and leukocytes

We find that there are two small clusters in the tSNE plot that lie outside the qNSC2 and the aNSC0. Using the interactive visualisation feature we can determine the names of these cells and check for differentially expressed genes from those.

outside_q2 <- c("GCGAGAATCGCTTAGA-1", "GTTAAGCGTGCACTTA-1", "TCATTTGTCGTCCAGG-1", 
"AACGTTGCACGCCAGT-2", "CAACTAGAGTCGCCGT-2", "CCACTACTCGGAATCT-2", 
"CCGTTCATCCTGCTTG-2", "CGCTGGAGTAGTACCT-2", "TACTTACTCCTAGGGC-2", 
"TAGTTGGCACATTAGC-2", "TGGCTGGCACTCAGGC-2", "TGTATTCCATGTTGAC-2"
)
outside_a0 <- c("ATGGGAGAGATCCGAG-1", "TACACGACAAAGTGCG-1", "CCATGTCTCCTAGGGC-2", 
"CGTGAGCCACCATGTA-2", "CTCGAAAAGTGCGATG-2", "TGACGGCCATCGATGT-2"
)
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = outside_a0 , ident.use = "outside_a0")
seurat_10X2 <- SetIdent(object = seurat_10X2 , cells.use = outside_q2 , ident.use = "outside_q2")
TSNEPlot(object = seurat_10X2 , do.label = TRUE)

First the cells outside aNSC0

outside_a0_markers <- FindMarkers(object = seurat_10X2 , ident.1 = "outside_a0")

   |+                                                 | 1 % ~05m 26s      
   |+                                                 | 2 % ~05m 19s      
   |++                                                | 3 % ~05m 15s      
   |++                                                | 4 % ~05m 13s      
   |+++                                               | 5 % ~05m 08s      
   |+++                                               | 6 % ~05m 03s      
   |++++                                              | 7 % ~04m 59s      
   |++++                                              | 8 % ~04m 56s      
   |+++++                                             | 9 % ~04m 53s      
   |+++++                                             | 10% ~04m 49s      
   |++++++                                            | 11% ~04m 47s      
   |++++++                                            | 12% ~04m 45s      
   |+++++++                                           | 13% ~04m 41s      
   |+++++++                                           | 14% ~04m 38s      
   |++++++++                                          | 15% ~04m 35s      
   |++++++++                                          | 16% ~04m 31s      
   |+++++++++                                         | 17% ~04m 28s      
   |+++++++++                                         | 18% ~04m 25s      
   |++++++++++                                        | 19% ~04m 22s      
   |++++++++++                                        | 20% ~04m 19s      
   |+++++++++++                                       | 21% ~04m 16s      
   |+++++++++++                                       | 22% ~04m 13s      
   |++++++++++++                                      | 23% ~04m 09s      
   |++++++++++++                                      | 24% ~04m 06s      
   |+++++++++++++                                     | 25% ~04m 03s      
   |+++++++++++++                                     | 26% ~03m 60s      
   |++++++++++++++                                    | 27% ~03m 56s      
   |++++++++++++++                                    | 28% ~03m 53s      
   |+++++++++++++++                                   | 29% ~03m 50s      
   |+++++++++++++++                                   | 30% ~03m 47s      
   |++++++++++++++++                                  | 31% ~03m 44s      
   |++++++++++++++++                                  | 32% ~03m 40s      
   |+++++++++++++++++                                 | 33% ~03m 37s      
   |+++++++++++++++++                                | 34% ~03m 34s      
   |++++++++++++++++++                                | 35% ~03m 31s      
   |++++++++++++++++++                                | 36% ~03m 27s      
   |+++++++++++++++++++                               | 37% ~03m 24s      
   |+++++++++++++++++++                               | 38% ~03m 21s      
   |++++++++++++++++++++                              | 39% ~03m 17s      
   |++++++++++++++++++++                              | 40% ~03m 14s      
   |+++++++++++++++++++++                             | 41% ~03m 11s      
   |+++++++++++++++++++++                             | 42% ~03m 08s      
   |++++++++++++++++++++++                            | 43% ~03m 05s      
   |++++++++++++++++++++++                            | 44% ~03m 01s      
   |+++++++++++++++++++++++                           | 45% ~02m 58s      
   |+++++++++++++++++++++++                           | 46% ~02m 55s      
   |++++++++++++++++++++++++                          | 47% ~02m 52s      
   |++++++++++++++++++++++++                          | 48% ~02m 49s      
   |+++++++++++++++++++++++++                         | 49% ~02m 46s      
   |+++++++++++++++++++++++++                         | 50% ~02m 43s      
   |++++++++++++++++++++++++++                        | 51% ~02m 39s      
   |++++++++++++++++++++++++++                        | 52% ~02m 36s      
   |+++++++++++++++++++++++++++                       | 53% ~02m 33s      
   |+++++++++++++++++++++++++++                       | 54% ~02m 30s      
   |++++++++++++++++++++++++++++                      | 55% ~02m 27s      
   |++++++++++++++++++++++++++++                     | 56% ~02m 23s      
   |+++++++++++++++++++++++++++++                     | 57% ~02m 20s      
   |+++++++++++++++++++++++++++++                     | 58% ~02m 17s      
   |++++++++++++++++++++++++++++++                    | 59% ~02m 13s      
   |++++++++++++++++++++++++++++++                    | 60% ~02m 10s      
   |+++++++++++++++++++++++++++++++                   | 61% ~02m 07s      
   |+++++++++++++++++++++++++++++++                   | 62% ~02m 04s      
   |++++++++++++++++++++++++++++++++                  | 63% ~02m 00s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 57s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 54s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 51s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 47s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 44s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 41s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 38s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 34s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 31s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 28s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~01m 25s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 21s      
   |++++++++++++++++++++++++++++++++++++++            | 76% ~01m 18s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 15s      
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~01m 12s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 08s      
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 05s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01m 02s      
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~59s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~55s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~52s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~49s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~46s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~42s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~39s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~36s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~33s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~29s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~23s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 05m 25s
outside_a0_markers

Checking the differentially expressed genes we can see many leukocyte marker genes, amongst them CD45.

## Ptprc = CD45 -> Leukocyte Common Antigen (LCA)
VlnPlot(object = seurat_10X2 ,  features.plot = c("Ptprc","Slc1a3") , x.lab.rot = TRUE )

Next the cells outside qNSC2

outside_q2_markers <- FindMarkers(object = seurat_10X2 , ident.1 = "outside_q2")

   |+                                                 | 1 % ~03m 40s      
   |+                                                 | 2 % ~03m 41s      
   |++                                                | 3 % ~03m 37s      
   |++                                                | 4 % ~03m 34s      
   |+++                                               | 5 % ~03m 31s      
   |+++                                               | 6 % ~03m 29s      
   |++++                                              | 7 % ~03m 26s      
   |++++                                              | 8 % ~03m 24s      
   |+++++                                             | 9 % ~03m 22s      
   |+++++                                             | 10% ~03m 19s      
   |++++++                                            | 11% ~03m 18s      
   |++++++                                            | 12% ~03m 15s      
   |+++++++                                           | 13% ~03m 13s      
   |+++++++                                           | 14% ~03m 11s      
   |++++++++                                          | 15% ~03m 09s      
   |++++++++                                          | 16% ~03m 07s      
   |+++++++++                                         | 17% ~03m 04s      
   |+++++++++                                         | 18% ~03m 02s      
   |++++++++++                                        | 19% ~03m 01s      
   |++++++++++                                        | 20% ~02m 59s      
   |+++++++++++                                       | 21% ~02m 56s      
   |+++++++++++                                       | 22% ~02m 54s      
   |++++++++++++                                      | 23% ~02m 52s      
   |++++++++++++                                      | 24% ~02m 49s      
   |+++++++++++++                                     | 25% ~02m 47s      
   |+++++++++++++                                     | 26% ~02m 45s      
   |++++++++++++++                                    | 27% ~02m 43s      
   |++++++++++++++                                    | 28% ~02m 41s      
   |+++++++++++++++                                   | 29% ~02m 38s      
   |+++++++++++++++                                   | 30% ~02m 36s      
   |++++++++++++++++                                  | 31% ~02m 34s      
   |++++++++++++++++                                  | 32% ~02m 31s      
   |+++++++++++++++++                                 | 33% ~02m 29s      
   |+++++++++++++++++                                | 34% ~02m 27s      
   |++++++++++++++++++                                | 35% ~02m 25s      
   |++++++++++++++++++                                | 36% ~02m 23s      
   |+++++++++++++++++++                               | 37% ~02m 20s      
   |+++++++++++++++++++                               | 38% ~02m 18s      
   |++++++++++++++++++++                              | 39% ~02m 16s      
   |++++++++++++++++++++                              | 40% ~02m 14s      
   |+++++++++++++++++++++                             | 41% ~02m 12s      
   |+++++++++++++++++++++                             | 42% ~02m 09s      
   |++++++++++++++++++++++                            | 43% ~02m 07s      
   |++++++++++++++++++++++                            | 44% ~02m 05s      
   |+++++++++++++++++++++++                           | 45% ~02m 03s      
   |+++++++++++++++++++++++                           | 46% ~02m 01s      
   |++++++++++++++++++++++++                          | 47% ~01m 58s      
   |++++++++++++++++++++++++                          | 48% ~01m 56s      
   |+++++++++++++++++++++++++                         | 49% ~01m 54s      
   |+++++++++++++++++++++++++                         | 50% ~01m 52s      
   |++++++++++++++++++++++++++                        | 51% ~01m 50s      
   |++++++++++++++++++++++++++                        | 52% ~01m 48s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 45s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 43s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 41s      
   |++++++++++++++++++++++++++++                     | 56% ~01m 39s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 37s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 34s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 32s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 30s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 28s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 25s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 23s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 21s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 19s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 16s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 15s      
   |++++++++++++++++++++++++++++++++++               | 68% ~01m 12s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 10s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 08s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 05s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 03s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 01s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~59s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~56s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~54s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~52s          
   |+++++++++++++++++++++++++++++++++++++++          | 78% ~50s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~47s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~45s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~43s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~40s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~38s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~36s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~34s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~29s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03m 42s
outside_q2_markers

Checking the differentially expressed genes we can see ependymal cell genes (Genes from https://pdfs.semanticscholar.org/e833/5f8154f714088147d76701ee0052d3a388b5.pdf)

VlnPlot(object = seurat_10X2 ,  features.plot = c("Iqca","Bbox1","Apoe","Syne1","Meig1","Foxj1","Slc1a3") , x.lab.rot = TRUE )

Next we exclude these contaminating cells and save the new seurat objects as a RDS file.

cells_to_remove <- WhichCells(object = seurat_10X2 , ident = c("outside_q2","outside_a0"))
cells_to_remove
 [1] "GCGAGAATCGCTTAGA-1" "GTTAAGCGTGCACTTA-1" "TCATTTGTCGTCCAGG-1"
 [4] "AACGTTGCACGCCAGT-2" "CAACTAGAGTCGCCGT-2" "CCACTACTCGGAATCT-2"
 [7] "CCGTTCATCCTGCTTG-2" "CGCTGGAGTAGTACCT-2" "TACTTACTCCTAGGGC-2"
[10] "TAGTTGGCACATTAGC-2" "TGGCTGGCACTCAGGC-2" "TGTATTCCATGTTGAC-2"
[13] "ATGGGAGAGATCCGAG-1" "TACACGACAAAGTGCG-1" "CCATGTCTCCTAGGGC-2"
[16] "CGTGAGCCACCATGTA-2" "CTCGAAAAGTGCGATG-2" "TGACGGCCATCGATGT-2"

After we made sure we know which kind of celltype these cells are, we can get rid of them in the following analysis

all_cells <- WhichCells(object = seurat_10X2 )
cells_to_keep <- all_cells[! all_cells %in% cells_to_remove]
seurat_10X2 <- SubsetData(object = seurat_10X2 , cells.use = cells_to_keep )
TSNEPlot(object = seurat_10X2 , do.label = TRUE)

Save the results as an RDS file

# saveRDS(object = seurat_10X2 , file = "seurat_10X2_clustered_min_1500_nGene.RDS")

SessionInfo

sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.3 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats4    parallel  stats     graphics  grDevices utils     datasets  methods  
[9] base     

other attached packages:
 [1] org.Mm.eg.db_3.5.0    AnnotationDbi_1.40.0  IRanges_2.12.0       
 [4] S4Vectors_0.16.0      bindrcpp_0.2          ReactomePA_1.22.0    
 [7] clusterProfiler_3.4.4 DOSE_3.4.0            RColorBrewer_1.1-2   
[10] pheatmap_1.0.10       kableExtra_0.9.0      knitr_1.20           
[13] Seurat_2.2.0          Matrix_1.2-14         cowplot_0.7.0        
[16] forcats_0.3.0         stringr_1.3.1         dplyr_0.7.4          
[19] purrr_0.2.4           readr_1.1.1           tidyr_0.7.2          
[22] tibble_1.4.2          ggplot2_2.2.1         tidyverse_1.2.1      
[25] Biobase_2.38.0        BiocGenerics_0.24.0  

loaded via a namespace (and not attached):
  [1] utf8_1.1.4           R.utils_2.6.0        lme4_1.1-18-1       
  [4] RSQLite_2.1.1        htmlwidgets_1.2      grid_3.4.3          
  [7] trimcluster_0.1-2    ranger_0.6.0         BiocParallel_1.12.0 
 [10] Rtsne_0.11           munsell_0.4.3        codetools_0.2-15    
 [13] ica_1.0-2            colorspace_1.3-2     GOSemSim_2.4.1      
 [16] rstudioapi_0.7       ROCR_1.0-7           robustbase_0.92-7   
 [19] dtw_1.20-1           NMF_0.20.6           labeling_0.3        
 [22] lars_1.2             mnormt_1.5-5         bit64_0.9-7         
 [25] rprojroot_1.3-2      diptest_0.75-7       R6_2.2.2            
 [28] doParallel_1.0.10    VGAM_1.0-3           flexmix_2.3-13      
 [31] bitops_1.0-6         fgsea_1.4.1          assertthat_0.2.0    
 [34] SDMTools_1.1-221     scales_0.5.0         nnet_7.3-12         
 [37] gtable_0.2.0         rlang_0.2.2          MatrixModels_0.4-1  
 [40] scatterplot3d_0.3-41 splines_3.4.3        lazyeval_0.2.0      
 [43] ModelMetrics_1.1.0   acepack_1.4.1        broom_0.4.3         
 [46] checkmate_1.8.5      yaml_2.2.0           reshape2_1.4.2      
 [49] abind_1.4-5          modelr_0.1.1         backports_1.1.2     
 [52] qvalue_2.10.0        Hmisc_4.1-1          caret_6.0-73        
 [55] tools_3.4.3          psych_1.7.8          gridBase_0.4-7      
 [58] gplots_3.0.1         proxy_0.4-22         ggridges_0.5.0      
 [61] Rcpp_0.12.18         plyr_1.8.4           base64enc_0.1-3     
 [64] rpart_4.1-12         pbapply_1.3-1        haven_1.1.2         
 [67] cluster_2.0.6        magrittr_1.5         data.table_1.11.6   
 [70] DO.db_2.9            openxlsx_4.1.0       reactome.db_1.62.0  
 [73] mvtnorm_1.0-5        hms_0.4.2            evaluate_0.11       
 [76] xtable_1.8-2         rio_0.5.10           mclust_5.2.2        
 [79] readxl_1.1.0         gridExtra_2.2.1      compiler_3.4.3      
 [82] KernSmooth_2.23-15   crayon_1.3.4         minqa_1.2.4         
 [85] R.oo_1.22.0          htmltools_0.3.6      segmented_0.5-1.4   
 [88] Formula_1.2-3        tclust_1.2-3         lubridate_1.7.1     
 [91] DBI_1.0.0            diffusionMap_1.1-0.1 MASS_7.3-48         
 [94] fpc_2.1-10           rappdirs_0.3.1       boot_1.3-20         
 [97] car_3.0-2            cli_1.0.0            R.methodsS3_1.7.1   
[100] gdata_2.17.0         bindr_0.1            igraph_1.0.1        
[103] pkgconfig_2.0.2      sn_1.5-0             rvcheck_0.1.0       
[106] registry_0.3         numDeriv_2016.8-1    foreign_0.8-69      
[109] xml2_1.1.1           foreach_1.4.3        rngtools_1.2.4      
[112] pkgmaker_0.22        rvest_0.3.2          digest_0.6.12       
[115] tsne_0.1-3           graph_1.56.0         rmarkdown_1.10      
[118] cellranger_1.1.0     fastmatch_1.1-0      htmlTable_1.12      
[121] curl_3.2             kernlab_0.9-25       gtools_3.5.0        
[124] modeltools_0.2-22    graphite_1.24.1      nloptr_1.0.4        
[127] nlme_3.1-131         jsonlite_1.5         carData_3.0-1       
[130] fansi_0.3.0          viridisLite_0.3.0    pillar_1.3.0        
[133] lattice_0.20-35      httr_1.3.1           DEoptimR_1.0-8      
[136] survival_2.41-3      GO.db_3.5.0          glue_1.3.0          
[139] zip_1.0.0            FNN_1.1              prabclus_2.2-6      
[142] iterators_1.0.8      bit_1.1-14           class_7.3-14        
[145] stringi_1.2.4        mixtools_1.0.4       blob_1.1.1          
[148] latticeExtra_0.6-28  caTools_1.17.1       memoise_1.0.0       
[151] irlba_2.1.2          ape_5.1             
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgTmV1cmFsIFN0ZW0gQ2VsbHMgZnJvbSB0aGUgc3VidmVudHJpY3VsYXIgem9uZSBzZXF1ZW5jZWQgYnkgMTBYIEdlbm9taWNzIDMnIENocm9taXVtIHByb3RvY29sIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgc21hcnQ6IG5vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCiMgQW5hbHlzaXMKCiMjIFByZXBhcmF0aW9ucwoKIyMjIExvYWRpbmcgdGhlIG5lY2Nlc3NhcnkgcGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KCJTZXVyYXQiKQpsaWJyYXJ5KCJNYXRyaXgiKQoKbGlicmFyeSgic3RyaW5nciIpCmxpYnJhcnkoImtuaXRyIikKbGlicmFyeSgia2FibGVFeHRyYSIpCgpsaWJyYXJ5KCJwaGVhdG1hcCIpCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCgpsaWJyYXJ5KCJjbHVzdGVyUHJvZmlsZXIiKQpsaWJyYXJ5KCJSZWFjdG9tZVBBIikKYGBgCgoKYGBge3J9CnNhdmVfY3N2IDwtIFRSVUUKYGBgCgoKPHN0eWxlPgogIC5ib3JkZXItcmlnaHQgewogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgZ3JleTsKICB9Cjwvc3R5bGU+CgoKIyMjIFNldHVwIHZlY3RvcnMgbmVlZGVkIGZvciB0aGUgYW5hbHlzaXM6IEdlbmVzIHdoaWNoIGFyZSBtYXJrZXJzIGZvciB0aGUgY2VsbCB0eXBlcwoKYGBge3J9Cm1hcmtlcnMuYmlvbC52YWxpZGF0ZWQgPC0gYygiVGhiczQiLCJDeGNsMTQiLCJDZDkiLCJOcjJlMSIsIklkMiIsIkFzY2wxIiwiRWdmciIsIkRjeCIsIkRseDEiLCJNa2k2NyIsIlNveDIiLCJTMTAwYiIsIkNkMjRhIiwiSWZ0ODgiLCJGb3hqMSIsIlBkZ2ZyYiIsIlBlY2FtMSIsIlNsYzFhMyIsIkdmYXAiLCJOZXMiLCJDeGNsMTAiLCJScGwzMiIsIkhlczEiLCJIZXM1IikKCm1hcmtlcnMuY3VzdG9tLm9yZGVyIDwtIGMoIlNmcnA1IiwiQm1wcjFhIiwiVmNhbTEiLCJTbGMxYTMiLCJJZDIiLCJIZXMxIiwiSGVzNSIsIkVnZnIiLCJBc2NsMSIsIk1raTY3IiwiUnBsMjIiLCJDZDkiLCJOcjJlMSIsIlNveDIiLCJTMTAwYiIpCmBgYAoKIyMjIExvYWQgYSBsaXN0IG9mIGNlbGwgY3ljbGUgc3BlY2lmaWMgZ2VuZXMgKHRha2VuIGZyb206IGh0dHA6Ly9zYXRpamFsYWIub3JnL3NldXJhdC9jZWxsX2N5Y2xlX3ZpZ25ldHRlLmh0bWwpCgpgYGB7cn0KY2MuZ2VuZXMgPC0gcmVhZExpbmVzKGNvbiA9ICJjZWxsX2N5Y2xlX2dlbmVzL2NlbGxfY3ljbGVfdmlnbmV0dGVfZmlsZXMvcmVnZXZfbGFiX2NlbGxfY3ljbGVfZ2VuZXMudHh0IikKY2MuZ2VuZXMgPC0gc3RyX3RvX3RpdGxlKGNjLmdlbmVzKQoKIyBTZXBhcmF0ZSBtYXJrZXJzIG9mIEcyL00gcGhhc2UgYW5kIG1hcmtlcnMgb2YgUyBwaGFzZQpzLmdlbmVzIDwtIGNjLmdlbmVzWzE6NDNdCmcybS5nZW5lcyA8LSBjYy5nZW5lc1s0NDo5N10KYGBgCgojIyMgTG9hZGluZyB0aGUgZGF0YQoKYGBge3J9CmRhdGFkaXIgPC0gImNvdW50X3RhYmxlL2ZpbHRlcmVkX2dlbmVfYmNfbWF0cmljZXNfbWV4L21tMTAvIgoKZGF0YV8xMFgyIDwtIFJlYWQxMFgoZGF0YS5kaXIgPSBmaWxlLnBhdGgoIGRhdGFkaXIpICkKYGBgCgojIyMgQ3JlYXRlIGEgU2V1cmF0IG9iamVjdCB3aXRoIHRoZSAxMFggZGF0YQoKYGBge3J9CnNldXJhdF8xMFgyIDwtIENyZWF0ZVNldXJhdE9iamVjdChyYXcuZGF0YSA9IGRhdGFfMTBYMiwgbWluLmNlbGxzID0gMywgbWluLmdlbmVzID0gMTUwMCwgcHJvamVjdCA9ICJ5b3VuZ192c19vbGRfMTBYMiIpCmBgYAoKIyMjIEFkZCBNZXRhZGF0YSBhbmQgY2hlY2sgUUMgdmFsdWVzCgpgYGB7cn0KbWl0by5nZW5lcyA8LSBncmVwKHBhdHRlcm4gPSAiXm10LSIsIHggPSByb3duYW1lcyh4ID0gc2V1cmF0XzEwWDJAZGF0YSksIHZhbHVlID0gVFJVRSkKCnBlcmNlbnQubWl0byA8LSBNYXRyaXg6OmNvbFN1bXMoc2V1cmF0XzEwWDJAcmF3LmRhdGFbbWl0by5nZW5lcywgXSkvTWF0cml4Ojpjb2xTdW1zKHNldXJhdF8xMFgyQHJhdy5kYXRhKQoKc2V1cmF0XzEwWDIgPC0gQWRkTWV0YURhdGEob2JqZWN0ID0gc2V1cmF0XzEwWDIsIG1ldGFkYXRhID0gcGVyY2VudC5taXRvLCBjb2wubmFtZSA9ICJwZXJjZW50Lm1pdG8iKQoKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiwgZmVhdHVyZXMucGxvdCA9IGMoIm5HZW5lIiwgIm5VTUkiLCAicGVyY2VudC5taXRvIiksIG5Db2wgPSAzICkKYGBgCgojIyMgQW5ub3RhdGUgdGhlIGNlbGxzIHdpdGggdGhlIGFnZSBvZiB0aGUgYW5pbWFscwoKV2UgY2FuIGFsc28gYW5ub3RhdGUgdGhlIGFnZSBvZiB0aGUgbW91c2UgZnJvbSB3aGljaCB0aGUgY2VsbHMgd2VyZSBwcmVwYXJlZCAoeW91bmcgb3Igb2xkKS4gV2Uga25vdyB0aGF0IGFsbCBjZWxsIGJhcmNvZGVzIGVuZGluZyBpbiAuLi4tMSBhcmUgYmVsb25pbmcgdG8gY2VsbHMgZnJvbSBvbGQgb2xkIG1pY2UsIHRoZSBjZWxsIGJhcmNvZGVzIGVuZGluZyBpbiAuLi4tMiBhcmUgZnJvbSB5b3VuZyBtaWNlLgoKYGBge3IgYW5ub3RhdGVfYWdlICxjYWNoZT1UUlVFfQphZ2UuY2VsbHMgPC0gZGF0YS5mcmFtZSggYWdlID0gYXMuZmFjdG9yKHJvd25hbWVzKHNldXJhdF8xMFgyQG1ldGEuZGF0YSkpICkgCnJvd25hbWVzKGFnZS5jZWxscykgPC0gcm93bmFtZXMoc2V1cmF0XzEwWDJAbWV0YS5kYXRhKSAKCmFnZS5jZWxscyRhZ2UgPC0gc3RyaW5ncjo6c3RyX3JlcGxhY2UoYWdlLmNlbGxzJGFnZSAsIHBhdHRlcm4gPSAiXlxcdystMSQiICwgcmVwbGFjZW1lbnQgPSAib2xkIikKYWdlLmNlbGxzJGFnZSA8LSBzdHJpbmdyOjpzdHJfcmVwbGFjZShhZ2UuY2VsbHMkYWdlICwgcGF0dGVybiA9ICJeXFx3Ky0yJCIgLCByZXBsYWNlbWVudCA9ICJ5b3VuZyIpCgphZ2UuY2VsbHMkYWdlX251bSA8LSBhZ2UuY2VsbHMkYWdlCmFnZS5jZWxscyRhZ2VfbnVtIDwtIHN0cmluZ3I6OnN0cl9yZXBsYWNlKGFnZS5jZWxscyRhZ2VfbnVtICwgcGF0dGVybiA9ICJvbGQiICwgcmVwbGFjZW1lbnQgPSAiMSIpCmFnZS5jZWxscyRhZ2VfbnVtIDwtIHN0cmluZ3I6OnN0cl9yZXBsYWNlKGFnZS5jZWxscyRhZ2VfbnVtICwgcGF0dGVybiA9ICJ5b3VuZyIgLCByZXBsYWNlbWVudCA9ICIyIikKYWdlLmNlbGxzJGFnZV9udW0gPC0gYXMubnVtZXJpYyhhZ2UuY2VsbHMkYWdlX251bSkKCmFnZS5jZWxscyRhZ2UgPC0gZmFjdG9yKGFnZS5jZWxscyRhZ2UpCgpzZXVyYXRfMTBYMiA8LSBBZGRNZXRhRGF0YShzZXVyYXRfMTBYMiwgYWdlLmNlbGxzICwgImFnZSIpCmBgYAoKIyMjIENoZWNrIHNjYXR0ZXJwbG90cyBvZiBuVU1JLCBuR2VuZSBhbmQgJSBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzCgpgYGB7cn0KcGFyKG1mcm93ID0gYygxLCAyKSkKR2VuZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIsIGdlbmUxID0gIm5VTUkiLCBnZW5lMiA9ICJwZXJjZW50Lm1pdG8iKQpHZW5lUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiwgZ2VuZTEgPSAiblVNSSIsIGdlbmUyID0gIm5HZW5lIikKYGBgCgojIyMgRmlsdGVyIHRoZSBjZWxscyB3aGljaCBoYXZlIHRvbyBoaWdoIG1pdG9jaG9uZHJpYWwgY29udGVudAoKYGBge3J9CnNldXJhdF8xMFgyIDwtIEZpbHRlckNlbGxzKG9iamVjdCA9IHNldXJhdF8xMFgyLCBzdWJzZXQubmFtZXMgPSBjKCJuR2VuZSIsICJwZXJjZW50Lm1pdG8iKSwgCiAgICBsb3cudGhyZXNob2xkcyA9IGMoMTUwMCwgLUluZiksIGhpZ2gudGhyZXNob2xkcyA9IGMoNDUwMCwgMC4xMCkpCmBgYAoKIyMjIENoZWNrIHNjYXR0ZXJwbG90cyBvZiBuVU1JLCBuR2VuZSBhbmQgJSBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzIGFmdGVyIGZpbHRlcmluZwoKYGBge3J9CnBhcihtZnJvdyA9IGMoMSwgMikpCkdlbmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyLCBnZW5lMSA9ICJuVU1JIiwgZ2VuZTIgPSAicGVyY2VudC5taXRvIikKR2VuZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIsIGdlbmUxID0gIm5VTUkiLCBnZW5lMiA9ICJuR2VuZSIpCmBgYAoKIyMjIExvZyBOb3JtYWxpemUgdGhlIGRhdGEKCmBgYHtyfQpzZXVyYXRfMTBYMiA8LSBOb3JtYWxpemVEYXRhKG9iamVjdCA9IHNldXJhdF8xMFgyLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLCBzY2FsZS5mYWN0b3IgPSAxMDAwMCkKYGBgCgojIyMgU2NhbGUgdGhlIGRhdGEgYW5kIHJlZ3Jlc3Mgb3V0IHRoZSBpbmZsdWVuY2Ugb2YgblVNSSBhbmQgcGVyY2VudC5taXRvCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30Kc2V1cmF0XzEwWDIgPC0gU2NhbGVEYXRhKG9iamVjdCA9IHNldXJhdF8xMFgyLCB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJuVU1JIiwgInBlcmNlbnQubWl0byIgLCAibkdlbmUiKSkKYGBgCgojIyMgUmVncmVzcyBvdXQgZGlmZmVyZW5jZSBiZXR3ZWVuIFMgcGhhc2UgYW5kIEcyL00gUGhhc2UKCmBgYHtyfQpzZXVyYXRfMTBYMiA8LSBDZWxsQ3ljbGVTY29yaW5nKG9iamVjdCA9IHNldXJhdF8xMFgyLCBzLmdlbmVzID0gcy5nZW5lcywgZzJtLmdlbmVzID0gZzJtLmdlbmVzLCBzZXQuaWRlbnQgPSBUUlVFKQpgYGAKCiMjIyMgTWV0YSBkYXRhIGNvbHVtbnMKCldlIGNhbiBzZWUgdGhhdCB0aGUgY29sdW1ucyBTLlNjb3JlLCBHMk0uU2NvcmUgYW5kIFBoYXNlIGFyZSBub3cgYWRkZWQgdG8gdGhlIG1ldGEgZGF0YSB0YWJsZQoKYGBge3J9CmhlYWQoc2V1cmF0XzEwWDJAbWV0YS5kYXRhKQpgYGAKCmBgYHtyfQpzZXVyYXRfMTBYMkBtZXRhLmRhdGEkQ0MuRGlmZmVyZW5jZSA8LSBzZXVyYXRfMTBYMkBtZXRhLmRhdGEkUy5TY29yZSAtIHNldXJhdF8xMFgyQG1ldGEuZGF0YSRHMk0uU2NvcmUKc2V1cmF0XzEwWDIgPC0gU2NhbGVEYXRhKG9iamVjdCA9IHNldXJhdF8xMFgyLCB2YXJzLnRvLnJlZ3Jlc3MgPSAiQ0MuRGlmZmVyZW5jZSIsIGRpc3BsYXkucHJvZ3Jlc3MgPSBGQUxTRSkKYGBgCgoKIyMgRGltZW5zaW9uYWwgcmVkdWN0aW9uIGFuZCBjbHVzdGVyaW5nCgojIyMgRmluZCB2YXJpYWJsZSBnZW5lcwoKYGBge3J9CnNldXJhdF8xMFgyIDwtIEZpbmRWYXJpYWJsZUdlbmVzKG9iamVjdCA9IHNldXJhdF8xMFgyLCBtZWFuLmZ1bmN0aW9uID0gRXhwTWVhbiwgZGlzcGVyc2lvbi5mdW5jdGlvbiA9IExvZ1ZNUiwgCiAgICB4Lmxvdy5jdXRvZmYgPSAwLjAxMjUsIHguaGlnaC5jdXRvZmYgPSA0LCB5LmN1dG9mZiA9IDAuNSkKYGBgCgpVc2luZyB0aGVzZSBwYXJhbWV0ZXJzIHdlIGhhdmUgaWRlbnRpZmllZCAyMjM2IGdlbmVzIGFzIHZhcmlhYmxlLgoKCiMjIyBSdW4gUENBCgpOb3cgd2UgdXNlIHRoZSBkZXRlY3RlZCB2YXJpYWJsZSBnZW5lcyB0byBwZWZvcm0gUENBIG9uIHRoZSBkYXRhCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30Kc2V1cmF0XzEwWDIgPC0gUnVuUENBKG9iamVjdCA9IHNldXJhdF8xMFgyLCBwYy5nZW5lcyA9IHNldXJhdF8xMFgyQHZhci5nZW5lcywgZG8ucHJpbnQgPSBUUlVFLCBwY3MucHJpbnQgPSAxOjUsIGdlbmVzLnByaW50ID0gNSAgLCBzZWVkLnVzZSA9IDIgKQpzZXVyYXRfMTBYMiA8LSBQcm9qZWN0UENBKG9iamVjdCA9IHNldXJhdF8xMFgyICkKc2V1cmF0XzEwWDIgPC0gSmFja1N0cmF3KG9iamVjdCA9IHNldXJhdF8xMFgyICApCmBgYAoKIyMjIEVsYm93cGxvdCBQQ0EKCmBgYHtyfQpQQ0VsYm93UGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMikKYGBgCgojIyMgUENBIFBsb3QKCmBgYHtyfQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAxLCBkaW0uMiA9IDIpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDEsIGRpbS4yID0gMykKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMSwgZGltLjIgPSA0KQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAxLCBkaW0uMiA9IDUpCgpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAyLCBkaW0uMiA9IDEpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDIsIGRpbS4yID0gMykKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMiwgZGltLjIgPSA0KQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAyLCBkaW0uMiA9IDUpCgpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAzLCBkaW0uMiA9IDEpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDMsIGRpbS4yID0gMikKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMywgZGltLjIgPSA0KQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAzLCBkaW0uMiA9IDUpCgpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA0LCBkaW0uMiA9IDEpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDQsIGRpbS4yID0gMikKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNCwgZGltLjIgPSAzKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA0LCBkaW0uMiA9IDUpCgpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA1LCBkaW0uMiA9IDEpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDUsIGRpbS4yID0gMikKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNSwgZGltLjIgPSAzKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA1LCBkaW0uMiA9IDQpCgpgYGAKCiMjIyBSdW4gdC1TTkUKYGBge3IgcmVzdWx0cz0naGlkZScsIGVjaG89RkFMU0UgIH0Kc2V1cmF0XzEwWDIgPC0gUnVuVFNORShzZXVyYXRfMTBYMiwgZGltcy51c2UgPSAxOjgsIGRvLmZhc3QgPSBUICwgc2VlZC51c2UgPSAxKQoKVFNORVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIpCmBgYAoKIyMgVXNlIGdyYXBoLWJhc2VkIGNsdXN0ZXJpbmcgdG8gY2x1c3RlciB0aGUgY2VsbHMgaW4gb3VyIGRhdGFzZXQKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQpzZXVyYXRfMTBYMiA8LSBGaW5kQ2x1c3RlcnMoc2V1cmF0XzEwWDIsIHJlZHVjdGlvbi50eXBlID0gInBjYSIsIGRpbXMudXNlID0gMTo4LCBzYXZlLlNOTiA9IFQgLCBmb3JjZS5yZWNhbGMgPSBUUlVFKQpgYGAKCiMjIyBQbG90IHQtU05FIHBsb3QKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMikKCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJhZ2VfbnVtIiAsIGNvbHMudXNlID0gYygicmVkIiwiZm9yZXN0Z3JlZW4iKSAsIG5vLmxlZ2VuZCA9IEZBTFNFICkgCgpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiblVNSSIgLCBjb2xzLnVzZSA9IGMoImxpZ2h0Z3JleSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UgKQoKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIm5HZW5lIiAsIGNvbHMudXNlID0gYygibGlnaHRncmV5IiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSApCgpgYGAKCkxldCdzIGxvb2sgYXQgdGhlIAoKYGBge3J9Cm1hcmtlcnMuc2V1cmF0XzEwWDIgPC0gRmluZEFsbE1hcmtlcnMoc2V1cmF0XzEwWDIsIHByaW50LmJhciA9IEZBTFNFICwgb25seS5wb3MgPSBUUlVFICwgcmV0dXJuLnRocmVzaCA9IDAuMDUpCgptYXJrZXJzLnNldXJhdF8xMFgyICU+JSBmaWx0ZXIoY2x1c3RlciA9PSAwKQoKbWFya2Vycy5zZXVyYXRfMTBYMiAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gMSkKCm1hcmtlcnMuc2V1cmF0XzEwWDIgJT4lIGZpbHRlcihjbHVzdGVyID09IDIpCgptYXJrZXJzLnNldXJhdF8xMFgyICU+JSBmaWx0ZXIoY2x1c3RlciA9PSAzKQoKbWFya2Vycy5zZXVyYXRfMTBYMiAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gNCkKCm1hcmtlcnMuc2V1cmF0XzEwWDIgJT4lIGZpbHRlcihjbHVzdGVyID09IDUpCgptYXJrZXJzLnNldXJhdF8xMFgyICU+JSBmaWx0ZXIoY2x1c3RlciA9PSA2KQoKbWFya2Vycy5zZXVyYXRfMTBYMiAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gNykKCm1hcmtlcnMuc2V1cmF0XzEwWDIgJT4lIGZpbHRlcihjbHVzdGVyID09IDgpCgptYXJrZXJzLnNldXJhdF8xMFgyICU+JSBmaWx0ZXIoY2x1c3RlciA9PSA5KQoKbWFya2Vycy5zZXVyYXRfMTBYMiAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gMTApCmBgYAoKIyMjIERpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYmV0d2VlbiBjbHVzdGVyIDYgYW5kIDgKCmBgYHtyfQptYXJrZXJzX2NsdXN0ZXJfNl92c184IDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNldXJhdF8xMFgyICwgaWRlbnQuMSA9IDYgLCBpZGVudC4yID0gOCAsIG9ubHkucG9zID0gVFJVRSAsIHByaW50LmJhciA9IEZBTFNFICkKCm1hcmtlcnNfY2x1c3Rlcl82X3ZzXzgKYGBgCgpDbHVzdGVyIDYgc2hvd3MgaW5jcmVhc2VkIGV4cHJlc3Npb24gb2YgTWFway1QYXRod2F5IHJlbGF0ZWQgZ2VuZXMsIGltbWVkaWF0ZS1lYXJseSBnZW5lcyBhbmQgdHJhbnNjcmlwdGlvbiBmYWN0b3JzLCBsaWtlOiBKdW4sIEZvcywgQXRmMywgSWVyMiAuLi4gCgpgYGB7cn0KbWFya2Vyc19jbHVzdGVyXzhfdnNfNiA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50LjEgPSA4ICAsIGlkZW50LjIgPSA2ICwgb25seS5wb3MgPSBUUlVFICwgcHJpbnQuYmFyID0gRkFMU0UgKQoKbWFya2Vyc19jbHVzdGVyXzhfdnNfNgpgYGAKCgojIyMgdFNORSBmZWF0dXJlIHBsb3RzOiBtYXJrZXIgZ2VuZXMKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMikKIyMgcXVpZXNjZW50IE1hcmtlcnMKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlRoYnM0IiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiSWQyIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQ3hjbDE0IiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQojIyBTdGVtIENlbGwgbWFya2VycwpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiU2xjMWEzIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiTnIyZTEiICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJIZXMxIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiSGVzNSIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIk5lcyIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKIyMKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkN4Y2wxMCIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKIyMgUHJvbGlmZXJhdGlvbiBtYXJrZXJzCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJScGwyMiIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlJwbDMyIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQ2Q5IiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQojIyBBc3Ryb2N5dGUgbWFya2VycwpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiUzEwMGIiICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJHZmFwIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQojIyBBY3RpdmUgTlNDIG1hcmtlcnMKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIk1raTY3IiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQXNjbDEiICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJFZ2ZyIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQojIyBUQVBzCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJWY2FtMSIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkRseDEiICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCiMjIE5ldXJvYmxhc3QgbWFya2VyCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJEY3giICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCiMjCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJTZnJwNSIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKIyMgT2xpZ29kZW5yb2N5dGUgbWFya2VyCkZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJPbGlnMSIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlBkZ2ZyYSIgLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlNveDEwIiAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQpgYGAKCiMjIyBDaGVjayB0U05FIFBsb3Qgd2l0aCBtYXJrZXJzIGZvdW5kIGJ5IEJhc2FrIGV0IGFsLiAoMjAxOCkKCmBgYHtyfSAgCiMgTG9hZCB0aGUgZ2VuZXMgYXMgdmVjdG9yCm1hcmtlcnMgPC0gYyggIkFndCIsIlNsYzZhOSIsIkV0bnBwbCIsIlNsYzZhMSIsIlNwYXJjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGMxYTMiLCJCY2FuIiwiVHNwYW43IiwiSHRyYTEiLCJDbGRuMTAiLCJQdG4iLCJBY3NsNiIsIkZnZnIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFyY2wxIiwiQXRwMWEyIiwiR3ByMzdsMSIsIkdqYTEiLCJQcm5wIiwiQWNzbDMiLCJBcXA0IiwiQXBvZSIsIkdtMjY5MTciLCAgICAgICAjIG1hcmtlcnMgZm9yIHF1aWVzY2VudCBOU0NzIC0gR20yNjkxNyA9IFJuNDVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3N0MyIsIkNsdSIsIlNsYzFhMiIsIlByZHg2IiwiTXQxIiwiQWxkb2MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2hhcmVkIGJldHdlZW4gcXVpZXNjZW50IGFuZCBwcmltZWQgTlNDcyAtIHNsYzFhMiBpbnN0ZWFkIG9mIHNjbDFhMiAocHJvYmFibHkgdHlwbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGJzNCIsIk50cmsyIiwiRnh5ZDEiLCJHc3RtMSIsIklnZmJwNSIsIlMxMDBhNiIsIkl0bTJiIiwiU2ZycDEiLCJEa2szIiwiQzRiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY290MSIsIkx1YzdsMyIsIkNrYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3BlIiwiRGJpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbWVkIE5TQ3MgYW5kIGVhcmx5IGFjdGl2ZSBOU0NzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlhdCIsIkxpbWExIiwiUGFicGMxIiwiQXNjbDEiLCJScGwxMiIsIk15Y24iLCJPbGlnMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGNuYSIsIkhzcDkwYWExIiwiSG5ybnBhYiIsIlJhbiIsIlBwaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVlZjFhMSIsIlB0bWEiLCJScGw0MSIsIk5wbTEiLCAiUnBzYSIsICJGYWJwNyIsICJFZ2ZyIiwgICAgICAgICAgICAgICAgICAgICAgICAjIGFjdGl2ZSBOU0NzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWtpNjciLCJEbHgyIiwiRGx4MSIsIkNkY2EzIiwiRGx4MWFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOcmVwIiwiVHViYjJiIiwiRGN4IiwiQnRnMSIsIk5maWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdhZDEiLCJOZHJnNCIsIlNuYXAyNSIsIlN5dDEiLCJSYmZveDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRtc2IxMCIsIlN0bW4yIiwiQ2QyNGEiLCJEbHg2b3MxIiwiVHViYjUiLCJUdWJiMyIsIkNjbmQyIiwiSG1nbjIiLCJIMmFmeiIsIlNveDExIiwiVHViYTFiIiwiVG1zYjR4IiwiU3RtbjEiLCJUcHQxIiwiUnBsMThhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgCgpgYGAKCgpgYGB7cn0gIAppbnRlcnZhbCA8LSBjKCBzZXEoIDEsIGxlbmd0aChtYXJrZXJzKSAsIGJ5ID0gcm91bmQobGVuZ3RoKG1hcmtlcnMpLzQpICkgLCBsZW5ndGgobWFya2VycykgKQoKaW50ZXJ2YWwKYGBgCgojIyMjIGEpIEFzY2w2IC0gQ2x1CgpgYGB7cn0gIApUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMikKCmZvcihpIGluIHNlcSggaW50ZXJ2YWxbMV0gLCBpbnRlcnZhbFsyXSApKXsKICBGZWF0dXJlUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSBtYXJrZXJzW2ldICxjb2xzLnVzZSA9IGMoImxpZ2h0Ymx1ZSIsInJlZCIpICwgbm8ubGVnZW5kID0gRkFMU0UpCn0KYGBgCgojIyMjIGIpIFNmcnAxIC0gQXNjbDEKCmBgYHtyfSAgClRTTkVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyKQoKZm9yKGkgaW4gc2VxKCBpbnRlcnZhbFsyXSsxICwgaW50ZXJ2YWxbM10gKSl7CiAgRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gbWFya2Vyc1tpXSAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQp9CmBgYAoKIyMjIyBjKSBOcG0xIC0gRGN4CgpgYGB7cn0gIApUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMikKCmZvcihpIGluIHNlcSggaW50ZXJ2YWxbM10rMSAsIGludGVydmFsWzRdICkpewogIEZlYXR1cmVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9IG1hcmtlcnNbaV0gLGNvbHMudXNlID0gYygibGlnaHRibHVlIiwicmVkIikgLCBuby5sZWdlbmQgPSBGQUxTRSkKfQpgYGAKCiMjIyMgZCkgVHViYjUgLSBScGwxOGEKCmBgYHtyfSAgClRTTkVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyKQoKZm9yKGkgaW4gc2VxKCBpbnRlcnZhbFs0XSsxICwgaW50ZXJ2YWxbNV0gKSl7CiAgRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gbWFya2Vyc1tpXSAsY29scy51c2UgPSBjKCJsaWdodGJsdWUiLCJyZWQiKSAsIG5vLmxlZ2VuZCA9IEZBTFNFKQp9CmBgYAoKIyMjIFZpb2xpbiBwbG90czogbWFya2VyIGdlbmVzCgpgYGB7cn0KIyMgcXVpZXNjZW50IE1hcmtlcnMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiVGhiczQiICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiSWQyIiApCiMjIFN0ZW0gQ2VsbCBtYXJrZXJzClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlNsYzFhMyIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJOcjJlMSIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJIZXMxIiApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkhlczUiICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiTmVzIiApCiMjClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkN4Y2wxMCIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJDeGNsMTQiICkKIyMgUHJvbGlmZXJhdGlvbiBtYXJrZXJzClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlJwbDIyIiApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlJwbDMyIiApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkNkOSIgKQojIyBBc3Ryb2N5dGUgbWFya2VycwpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJTMTAwYiIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJHZmFwIiApCiMjIEFjdGl2ZSBOU0MgbWFya2VycyAmIFRBUFMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiTWtpNjciICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQXNjbDEiICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiRWdmciIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJWY2FtMSIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJEbHgxIiApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkRseDIiICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQXRwMWEyIiApCiMjIE5ldXJvYmxhc3QgbWFya2VyClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkRjeCIgKQojIwpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJTZnJwNSIgKQojIyBPbGlnb2RlbnJvY3l0ZSBtYXJrZXIKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiT2xpZzEiICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiUGRnZnJhIiApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlNveDEwIiApCmBgYAoKIyMjIEhlYXRtYXAgbWFya2VyIGdlbmVzCgpgYGB7ciBmaWcud2lkdGg9MTYgLCBmaWcuaGVpZ2h0PTh9Cm1hcmtlcnNfcGxvdHMgPC0gYyggIlRoYnM0IiAsICJJZDIiICwgIlNsYzFhMyIgLCAiTnIyZTEiICwgIkhlczEiICwgIkhlczUiICwgIk5lcyIgLCAiQ3hjbDEwIiAsICJScGwyMiIgLCAiUnBsMzIiICwgIkNkOSIgLCAiUzEwMGIiICwgIkdmYXAiICwgIk1raTY3IiAsICJBc2NsMSIgLCAiRWdmciIgLCAiVmNhbTEiICwgIkRseDEiICwgIkRjeCIgLCAiU2ZycDUiICwgIk9saWcxIiAsICJQZGdmcmEiICwgIlNveDEwIiApCgpEb0hlYXRtYXAob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBnZW5lcy51c2UgPSBtYXJrZXJzX3Bsb3RzKQpgYGAKCgojIyBTZXQgaWRlbnRpdGllcyBmcm9tIG1hcmtlciBnZW5lIGV4cHJlc3Npb24KCmBgYHtyfQpzZXVyYXRfMTBYMiA8LSBTZXRJZGVudChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGNlbGxzLnVzZSA9IFdoaWNoQ2VsbHMob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBpZGVudCA9IGMoMCkgKSAsIGlkZW50LnVzZSA9ICJxTlNDMSIgICkKc2V1cmF0XzEwWDIgPC0gU2V0SWRlbnQob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBjZWxscy51c2UgPSBXaGljaENlbGxzKG9iamVjdCA9IHNldXJhdF8xMFgyICwgaWRlbnQgPSBjKDQpICkgLCBpZGVudC51c2UgPSAicU5TQzIiICApCnNldXJhdF8xMFgyIDwtIFNldElkZW50KG9iamVjdCA9IHNldXJhdF8xMFgyICwgY2VsbHMudXNlID0gV2hpY2hDZWxscyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50ID0gYyg2LDgpICkgLCBpZGVudC51c2UgPSAiYU5TQzAiICApCnNldXJhdF8xMFgyIDwtIFNldElkZW50KG9iamVjdCA9IHNldXJhdF8xMFgyICwgY2VsbHMudXNlID0gV2hpY2hDZWxscyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50ID0gYygzLDUpICkgLCBpZGVudC51c2UgPSAiYU5TQzEiICApCnNldXJhdF8xMFgyIDwtIFNldElkZW50KG9iamVjdCA9IHNldXJhdF8xMFgyICwgY2VsbHMudXNlID0gV2hpY2hDZWxscyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50ID0gYygxKSApICwgaWRlbnQudXNlID0gImFOU0MyIiAgKQpzZXVyYXRfMTBYMiA8LSBTZXRJZGVudChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGNlbGxzLnVzZSA9IFdoaWNoQ2VsbHMob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBpZGVudCA9IGMoMikgKSAsIGlkZW50LnVzZSA9ICJUQVAiICApCnNldXJhdF8xMFgyIDwtIFNldElkZW50KG9iamVjdCA9IHNldXJhdF8xMFgyICwgY2VsbHMudXNlID0gV2hpY2hDZWxscyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50ID0gYyg3KSApICwgaWRlbnQudXNlID0gIk5CIiAgKQpzZXVyYXRfMTBYMiA8LSBTZXRJZGVudChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGNlbGxzLnVzZSA9IFdoaWNoQ2VsbHMob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBpZGVudCA9IGMoMTApICkgLCBpZGVudC51c2UgPSAiT1BDIiAgKQpzZXVyYXRfMTBYMiA8LSBTZXRJZGVudChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGNlbGxzLnVzZSA9IFdoaWNoQ2VsbHMob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBpZGVudCA9IGMoOSkgKSAsIGlkZW50LnVzZSA9ICJPRCIgICkKCmBgYAoKIyMjIEJ1aWxkIENsdXN0ZXIgVHJlZQoKYGBge3J9CnNldXJhdF8xMFgyIDwtIEJ1aWxkQ2x1c3RlclRyZWUob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBwY3MudXNlID0gMTo4KQpgYGAKCgojIyMgUENBIFBsb3Qgd2l0aCBpZGVudGl0aWVzCgpgYGB7cn0KUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMSwgZGltLjIgPSAyKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAxLCBkaW0uMiA9IDMpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDEsIGRpbS4yID0gNCkKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMSwgZGltLjIgPSA1KQoKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMiwgZGltLjIgPSAxKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAyLCBkaW0uMiA9IDMpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDIsIGRpbS4yID0gNCkKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMiwgZGltLjIgPSA1KQoKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMywgZGltLjIgPSAxKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSAzLCBkaW0uMiA9IDIpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDMsIGRpbS4yID0gNCkKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gMywgZGltLjIgPSA1KQoKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNCwgZGltLjIgPSAxKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA0LCBkaW0uMiA9IDIpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDQsIGRpbS4yID0gMykKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNCwgZGltLjIgPSA1KQoKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNSwgZGltLjIgPSAxKQpQQ0FQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZGltLjEgPSA1LCBkaW0uMiA9IDIpClBDQVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkaW0uMSA9IDUsIGRpbS4yID0gMykKUENBUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRpbS4xID0gNSwgZGltLjIgPSA0KQoKYGBgCgojIyMgdFNORSBmZWF0dXJlIHBsb3RzOiBtYXJrZXIgZ2VuZXMKCmBgYHtyfQoKVFNORVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIpClRTTkVQbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZG8ubGFiZWwgPSBUUlVFKQpgYGAKCiMjIyBWaW9saW4gcGxvdHM6IG1hcmtlciBnZW5lcwoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KY2VsbHR5cGVzX29yZGVyIDwtIGMoInFOU0MxIiwicU5TQzIiLCJhTlNDMCIsImFOU0MxIiwiYU5TQzIiLCJUQVAiLCJOQiIsIk9QQyIsIk9EIikKCgojIyBxdWllc2NlbnQgTWFya2VycwpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJUaGJzNCIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJJZDIiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKIyMgU3RlbSBDZWxsIG1hcmtlcnMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiU2xjMWEzIiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIk5yMmUxIiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkhlczEiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiSGVzNSIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJOZXMiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKIyMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQ3hjbDEwIiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApCiMjIFByb2xpZmVyYXRpb24gbWFya2VycwpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJScGwyMiIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJScGwzMiIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJDZDkiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKIyMgQXN0cm9jeXRlIG1hcmtlcnMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiUzEwMGIiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiR2ZhcCIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQojIyBBY3RpdmUgTlNDIG1hcmtlcnMKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiQXNjbDEiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiRWdmciIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQojIyBUQVBzClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlZjYW0xIiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIkRseDEiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKIyMgTmV1cm9ibGFzdCBtYXJrZXIKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiRGN4IiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApCiMjClZsblBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gIlNmcnA1IiAsICBkby5yZXR1cm4gPSBUUlVFKSArIHNjYWxlX3hfZGlzY3JldGUoIGxpbWl0cyA9IGNlbGx0eXBlc19vcmRlciApCiMjIE9saWdvZGVucm9jeXRlIG1hcmtlcgpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJPbGlnMSIgLCAgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9ICJQZGdmcmEiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSAiU294MTAiICwgIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKYGBgCgpgYGB7cn0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZlYXR1cmVzLnBsb3QgPSBjKCJuVU1JIikgICwgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9IGMoIm5HZW5lIikgICwgZG8ucmV0dXJuID0gVFJVRSkgKyBzY2FsZV94X2Rpc2NyZXRlKCBsaW1pdHMgPSBjZWxsdHlwZXNfb3JkZXIgKQpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmVhdHVyZXMucGxvdCA9IGMoInBlcmNlbnQubWl0byIpICAsIGRvLnJldHVybiA9IFRSVUUpICsgc2NhbGVfeF9kaXNjcmV0ZSggbGltaXRzID0gY2VsbHR5cGVzX29yZGVyICkKYGBgCgoKIyMjIEhlYXRtYXAgbWFya2VyIGdlbmVzCgpgYGB7ciBmaWcuaGVpZ2h0PTEyfQptYXJrZXJzX3Bsb3RzIDwtIGMoICJUaGJzNCIgLCAiSWQyIiAsICJTbGMxYTMiICwgIk5yMmUxIiAsICJIZXMxIiAsICJIZXM1IiAsICJOZXMiICwgIkN4Y2wxMCIgLCAiUnBsMjIiICwgIlJwbDMyIiAsICJDZDkiICwgIlMxMDBiIiAsICJHZmFwIiAsICJNa2k2NyIgLCAiQXNjbDEiICwgIkVnZnIiICwgIlZjYW0xIiAsICJEbHgxIiAsICJEY3giICwgIlNmcnA1IiAsICJPbGlnMSIgLCAiUGRnZnJhIiAsICJTb3gxMCIgKQoKRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF8xMFgyICwgZ2VuZXMudXNlID0gbWFya2Vyc19wbG90cyAsIHNsaW0uY29sLmxhYmVsID0gVFJVRSAsIGNvbC5sb3cgPSAiYmx1ZSIgLCBjb2wubWlkID0gIndoaXRlIiAsIGNvbC5oaWdoID0gInJlZCIgLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFICApCmBgYAoKYGBge3IgZmlnLmhlaWdodD0xMn0KRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF8xMFgyICwgZ2VuZXMudXNlID0gbWFya2Vycy5jdXN0b20ub3JkZXIgLCBzbGltLmNvbC5sYWJlbCA9IFRSVUUgLCBjb2wubG93ID0gImJsdWUiICwgY29sLm1pZCA9ICJ3aGl0ZSIgLCBjb2wuaGlnaCA9ICJyZWQiICwgZ3JvdXAubGFiZWwucm90ID0gVFJVRSApCmBgYAoKYGBge3IgZmlnLmhlaWdodD0xMn0KRG9IZWF0bWFwKG9iamVjdCA9IHNldXJhdF8xMFgyICwgZ2VuZXMudXNlID0gbWFya2VycyAsIHNsaW0uY29sLmxhYmVsID0gVFJVRSAsIGNvbC5sb3cgPSAiYmx1ZSIgLCBjb2wubWlkID0gIndoaXRlIiAsIGNvbC5oaWdoID0gInJlZCIgLCBncm91cC5sYWJlbC5yb3QgPSBUUlVFICApCmBgYAoKIyMgU2F2ZSBpZGVudGl0aWVzIHRvIG1ldGEuZGF0YSB0YWJsZQoKYGBge3J9CnNldXJhdF8xMFgyIDwtIFN0YXNoSWRlbnQob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBzYXZlLm5hbWUgPSAiY2VsbHR5cGUiKSAKYGBgCgoKIyMgRmluZCBtYXJrZXIgZ2VuZXMgZm9yIHRoZSBzdWJwb3B1bGF0aW9ucyBhbmQgc2F2ZSB0aGVtIGFzIGNzdiBmaWxlcwoKYGBge3J9Cm1hcmtlcnMuc2V1cmF0XzEwWDIgPC0gRmluZEFsbE1hcmtlcnMoc2V1cmF0XzEwWDIpCgojIFNwbGl0IHRoZSB0YWJsZSBpbnRvIG9uZSB0YWJsZSBmb3IgZWFjaCBjbHVzdGVyCm1hcmtlcnNfY2x1c3RlcnMgPC0gbGlzdCgpCgojIyBTYXZlIHVwIGFuZCBkb3duIHJlZ3VsYXRlZCBnZW5lcyBwZXIgY2x1c3Rlcgpmb3IoIGNsIGluIHVuaXF1ZShtYXJrZXJzLnNldXJhdF8xMFgyJGNsdXN0ZXIpICl7CiAgbWFya2Vyc19jbHVzdGVyc1tbY2xdXSA8LSBsaXN0KCkKICBtYXJrZXJzX2NsdXN0ZXJzW1tjbF1dW1sidXAiXV0gPC0gZmlsdGVyKG1hcmtlcnMuc2V1cmF0XzEwWDIgLCBjbHVzdGVyID09IGNsICYgYXZnX2xvZ0ZDID4gMCApCiAgbWFya2Vyc19jbHVzdGVyc1tbY2xdXVtbImRvd24iXV0gPC0gZmlsdGVyKG1hcmtlcnMuc2V1cmF0XzEwWDIgLCBjbHVzdGVyID09IGNsICYgYXZnX2xvZ0ZDIDwgMCApCn0KCmZvciggY2wgaW4gdW5pcXVlKG1hcmtlcnMuc2V1cmF0XzEwWDIkY2x1c3RlcikgKXsKICBmb3IoaiBpbiBjKCJ1cCIsImRvd24iKSkKICBpZihzYXZlX2Nzdil7IHdyaXRlLmNzdih4ID0gbWFya2Vyc19jbHVzdGVyc1tbY2xdXVtbal1dICwgZmlsZSA9IHBhc3RlMCgiY2VsbHR5cGVfbWFya2Vycy9jZWxsdHlwZV8iICwgY2wgLCAiXyIsIGogLCAicmVndWxhdGVkIiAsICJfbWFya2Vyc18xMFgyX3lvdW5nX29sZC5jc3YiICkpIH0KfQpgYGAKCiMjIHQtU05FIHBsb3RzIHdpdGggY2x1c3RlciBpZGVudGl0eSBvciB3aXRoIGFnZSAKCkNvbG9yIHRoZSB0U05FIHBsb3QgYnkgdGhlIGFnZSBvZiB0aGUgYW5pbWFscwoKYGBge3J9CnggPC0gRmVhdHVyZVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBmZWF0dXJlcy5wbG90ID0gImFnZV9udW0iICwgY29scy51c2UgPSBjKCJzbGF0ZWJsdWUiLCJ5ZWxsb3dncmVlbiIpICwgbm8ubGVnZW5kID0gRkFMU0UgLCBkby5yZXR1cm4gPSBUUlVFICkKCnRzbmVfYWdlcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHgkYWdlX251bSRkYXRhICwgbWFwcGluZyA9IGFlcyh4ID0geCAsIHkgPSB5ICwgY29sb3IgPSBjb2wpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlYmx1ZSIsInllbGxvd2dyZWVuIikgLCBsYWJlbHMgPSBjKCAib2xkIiAsICJ5b3VuZyIgKSAsIG5hbWUgPSAiYWdlIG9mIGFuaW1hbCIgKSArIGxhYnMoIHggPSAidFNORV8xIiAsIHkgPSAidFNORV8yIiApICsgY29vcmRfZXF1YWwoKQoKcGxvdHNpemUgPSA1Cgp0c25lX2FnZXBsb3QKI2dnc2F2ZShwbG90ID0gdHNuZV9hZ2VwbG90ICwgZmlsZW5hbWUgPSAiYWdlX3RzbmVfaGlyZXMucG5nIiAsIHdpZHRoID0gcGxvdHNpemUgLCBoZWlnaHQgPSBwbG90c2l6ZSApCmBgYAoKYGBge3IgZmlnLmFzcD0xfQpnZ3Bsb3QoZGF0YSA9IHgkYWdlX251bSRkYXRhICwgbWFwcGluZyA9IGFlcyh4ID0geCAsIHkgPSB5ICwgY29sb3IgPSBjb2wpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInNsYXRlYmx1ZSIsInllbGxvd2dyZWVuIikgLCBsYWJlbHMgPSBjKCAib2xkIiAsICJ5b3VuZyIgKSAsIG5hbWUgPSAiYWdlIG9mIGFuaW1hbCIgKSArIGxhYnMoIHggPSAidFNORV8xIiAsIHkgPSAidFNORV8yIiApICsgY29vcmRfZXF1YWwoKSAjICsgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKQpgYGAKCkNvbG9yIHRoZSB0U05FIGJ5IHRoZSBpZGVudGlmaWVkIGNlbGx0eXBlcyBhbmQgc3VicG9wdWxhdGlvbnMKCmBgYHtyfQpnIDwtIFRTTkVQbG90KHNldXJhdF8xMFgyICwgZG8ucmV0dXJuID0gVFJVRSkKCmdncGxvdChkYXRhID0gZyRkYXRhICwgbWFwcGluZyA9IGFlcyh4ID0geCAsIHkgPSB5ICwgY29sb3IgPSBpZGVudCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKyAKICBsYWJzKCB4ID0gInRTTkVfMSIgLCB5ID0gInRTTkVfMiIgKSArIAogIGNvb3JkX2VxdWFsKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gICBjKCBxTlNDMSA9ICJzdGVlbGJsdWUiICwgcU5TQzIgPSAic3RlZWxibHVlMSIgLCBhTlNDMCA9ICJ0b21hdG8iICwgYU5TQzEgPSAic2llbm5hMSIsIGFOU0MyID0gInNpZW5uYTMiICwgVEFQID0gImdyZWVuIiAsIE5CID0gInllbGxvdyIgLCBPUEMgPSAicGluayIgLCBPRCA9ICJ2aW9sZXQiKSAsIG5hbWUgPSAiVHlwZSIgKQpgYGAKCmBgYHtyIGZpZy5hc3A9MX0KZ2dwbG90KGRhdGEgPSBnJGRhdGEgLCBtYXBwaW5nID0gYWVzKHggPSB4ICwgeSA9IHkgLCBjb2xvciA9IGlkZW50KSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAxKSArIAogIGxhYnMoIHggPSAidFNORV8xIiAsIHkgPSAidFNORV8yIiApICsgCiAgY29vcmRfZXF1YWwoKSArIAogICMgZ3VpZGVzKGNvbG9yID0gIm5vbmUiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAgIGMoIHFOU0MxID0gInN0ZWVsYmx1ZSIgLCBxTlNDMiA9ICJzdGVlbGJsdWUxIiAsIGFOU0MwID0gInRvbWF0byIgLCBhTlNDMSA9ICJzaWVubmExIiwgYU5TQzIgPSAic2llbm5hMyIgLCBUQVAgPSAiZ3JlZW4iICwgTkIgPSAieWVsbG93IiAsIE9QQyA9ICJwaW5rIiAsIE9EID0gInZpb2xldCIpICwgbmFtZSA9ICJUeXBlIiApCgpgYGAKCgojIyBTYXZlIHRoZSBhbmFseXNpcyByZXN1bHRzIHNvIGZhciBhcyBSRFMgZmlsZQpgYGB7cn0KIyBzYXZlUkRTKG9iamVjdCA9IHNldXJhdF8xMFgyICwgZmlsZSA9ICJzZXVyYXRfMTBYMl9jbHVzdGVyZWRfbWluXzE1MDBfbkdlbmVfYWxsX2NlbGxzLlJEUyIpCmBgYAoKIyMgSWRlbnRpZnkgYW5kIGZpbHRlciBvdXQgY29udGFtaW5hdGluZyBlcGVuZHltYWwgY2VsbHMgYW5kIGxldWtvY3l0ZXMKCldlIGZpbmQgdGhhdCB0aGVyZSBhcmUgdHdvIHNtYWxsIGNsdXN0ZXJzIGluIHRoZSB0U05FIHBsb3QgdGhhdCBsaWUgb3V0c2lkZSB0aGUgcU5TQzIgYW5kIHRoZSBhTlNDMC4gVXNpbmcgdGhlIGludGVyYWN0aXZlIHZpc3VhbGlzYXRpb24gZmVhdHVyZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBuYW1lcyBvZiB0aGVzZSBjZWxscyBhbmQgY2hlY2sgZm9yIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBmcm9tIHRob3NlLgoKYGBge3J9Cm91dHNpZGVfcTIgPC0gYygiR0NHQUdBQVRDR0NUVEFHQS0xIiwgIkdUVEFBR0NHVEdDQUNUVEEtMSIsICJUQ0FUVFRHVENHVENDQUdHLTEiLCAKIkFBQ0dUVEdDQUNHQ0NBR1QtMiIsICJDQUFDVEFHQUdUQ0dDQ0dULTIiLCAiQ0NBQ1RBQ1RDR0dBQVRDVC0yIiwgCiJDQ0dUVENBVENDVEdDVFRHLTIiLCAiQ0dDVEdHQUdUQUdUQUNDVC0yIiwgIlRBQ1RUQUNUQ0NUQUdHR0MtMiIsIAoiVEFHVFRHR0NBQ0FUVEFHQy0yIiwgIlRHR0NUR0dDQUNUQ0FHR0MtMiIsICJUR1RBVFRDQ0FUR1RUR0FDLTIiCikKCm91dHNpZGVfYTAgPC0gYygiQVRHR0dBR0FHQVRDQ0dBRy0xIiwgIlRBQ0FDR0FDQUFBR1RHQ0ctMSIsICJDQ0FUR1RDVENDVEFHR0dDLTIiLCAKIkNHVEdBR0NDQUNDQVRHVEEtMiIsICJDVENHQUFBQUdUR0NHQVRHLTIiLCAiVEdBQ0dHQ0NBVENHQVRHVC0yIgopCmBgYAoKYGBge3J9CnNldXJhdF8xMFgyIDwtIFNldElkZW50KG9iamVjdCA9IHNldXJhdF8xMFgyICwgY2VsbHMudXNlID0gb3V0c2lkZV9hMCAsIGlkZW50LnVzZSA9ICJvdXRzaWRlX2EwIikKc2V1cmF0XzEwWDIgPC0gU2V0SWRlbnQob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBjZWxscy51c2UgPSBvdXRzaWRlX3EyICwgaWRlbnQudXNlID0gIm91dHNpZGVfcTIiKQpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGRvLmxhYmVsID0gVFJVRSkKYGBgCgpGaXJzdCB0aGUgY2VsbHMgb3V0c2lkZSBhTlNDMAoKYGBge3J9Cm91dHNpZGVfYTBfbWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGlkZW50LjEgPSAib3V0c2lkZV9hMCIpCgpvdXRzaWRlX2EwX21hcmtlcnMKYGBgCgpDaGVja2luZyB0aGUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIHdlIGNhbiBzZWUgbWFueSBsZXVrb2N5dGUgbWFya2VyIGdlbmVzLCBhbW9uZ3N0IHRoZW0gQ0Q0NS4KCmBgYHtyIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD02fQojIyBQdHByYyA9IENENDUgLT4gTGV1a29jeXRlIENvbW1vbiBBbnRpZ2VuIChMQ0EpCgpWbG5QbG90KG9iamVjdCA9IHNldXJhdF8xMFgyICwgIGZlYXR1cmVzLnBsb3QgPSBjKCJQdHByYyIsIlNsYzFhMyIpICwgeC5sYWIucm90ID0gVFJVRSApCmBgYAoKCk5leHQgdGhlIGNlbGxzIG91dHNpZGUgcU5TQzIKCmBgYHtyfQpvdXRzaWRlX3EyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBpZGVudC4xID0gIm91dHNpZGVfcTIiKQoKb3V0c2lkZV9xMl9tYXJrZXJzCmBgYAoKQ2hlY2tpbmcgdGhlIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyB3ZSBjYW4gc2VlIGVwZW5keW1hbCBjZWxsIGdlbmVzIChHZW5lcyBmcm9tIGh0dHBzOi8vcGRmcy5zZW1hbnRpY3NjaG9sYXIub3JnL2U4MzMvNWY4MTU0ZjcxNDA4ODE0N2Q3NjcwMWVlMDA1MmQzYTM4OGI1LnBkZikKCmBgYHtyIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0yMH0KVmxuUGxvdChvYmplY3QgPSBzZXVyYXRfMTBYMiAsICBmZWF0dXJlcy5wbG90ID0gYygiSXFjYSIsIkJib3gxIiwiQXBvZSIsIlN5bmUxIiwiTWVpZzEiLCJGb3hqMSIsIlNsYzFhMyIpICwgeC5sYWIucm90ID0gVFJVRSApCmBgYAoKTmV4dCB3ZSBleGNsdWRlIHRoZXNlIGNvbnRhbWluYXRpbmcgY2VsbHMgYW5kIHNhdmUgdGhlIG5ldyBzZXVyYXQgb2JqZWN0cyBhcyBhIFJEUyBmaWxlLgoKYGBge3J9CmNlbGxzX3RvX3JlbW92ZSA8LSBXaGljaENlbGxzKG9iamVjdCA9IHNldXJhdF8xMFgyICwgaWRlbnQgPSBjKCJvdXRzaWRlX3EyIiwib3V0c2lkZV9hMCIpKQoKY2VsbHNfdG9fcmVtb3ZlCmBgYAoKQWZ0ZXIgd2UgbWFkZSBzdXJlIHdlIGtub3cgd2hpY2gga2luZCBvZiBjZWxsdHlwZSB0aGVzZSBjZWxscyBhcmUsIHdlIGNhbiBnZXQgcmlkIG9mIHRoZW0gaW4gdGhlIGZvbGxvd2luZyBhbmFseXNpcwoKYGBge3J9CmFsbF9jZWxscyA8LSBXaGljaENlbGxzKG9iamVjdCA9IHNldXJhdF8xMFgyICkKCmNlbGxzX3RvX2tlZXAgPC0gYWxsX2NlbGxzWyEgYWxsX2NlbGxzICVpbiUgY2VsbHNfdG9fcmVtb3ZlXQoKc2V1cmF0XzEwWDIgPC0gU3Vic2V0RGF0YShvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGNlbGxzLnVzZSA9IGNlbGxzX3RvX2tlZXAgKQoKVFNORVBsb3Qob2JqZWN0ID0gc2V1cmF0XzEwWDIgLCBkby5sYWJlbCA9IFRSVUUpCmBgYAoKIyMgU2F2ZSB0aGUgcmVzdWx0cyBhcyBhbiBSRFMgZmlsZQoKYGBge3J9CiMgc2F2ZVJEUyhvYmplY3QgPSBzZXVyYXRfMTBYMiAsIGZpbGUgPSAic2V1cmF0XzEwWDJfY2x1c3RlcmVkX21pbl8xNTAwX25HZW5lLlJEUyIpCmBgYAoKCgpTZXNzaW9uSW5mbwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCg==